2013-02-20 29 views
6

Tôi mới sử dụng NoSQL, và tôi đang gãi đầu để tìm ra cách triển khai NoSQL phù hợp nhất cho ứng dụng mà tôi đang cố gắng xây dựng.Việc triển khai NoSQL nào là phù hợp nhất?

Ứng dụng Java của tôi cần có một băm trong bộ nhớ chứa hàng triệu đến hàng tỷ mục nhập vì nó mô hình một mạng nơron một lớp. Ngay bây giờ chúng tôi đang sử dụng Trove để có thể sử dụng nguyên thủy làm khóa và giá trị để giảm kích thước của bản đồ và tăng tốc độ truy cập. Bản đồ là bản đồ bản đồ nơi các khóa của bản đồ bên ngoài dài và các bản đồ bên trong có khóa/giá trị dài/nổi.

Chúng tôi cần có thể đọc trạng thái đã lưu từ đĩa đến bản đồ của bản đồ khi ứng dụng khởi động. Những thay đổi đối với bản đồ bản đồ cũng cần được lưu vào đĩa hoặc liên tục hoặc theo một số khoảng thời gian đã lên lịch.

Tôi lần đầu tiên được rút về phía OrientDB vì tài liệu và đối tượng DB của họ, mặc dù tôi vẫn không chắc chắn vào thời điểm này sẽ tốt hơn. Sau đó, tôi đi qua Redis, đó là một cửa hàng giá trị quan trọng và làm việc với một bộ nhớ trong bộ nhớ có thể được bán phá giá vào đĩa, bao gồm cả nhân rộng master-slave. Tuy nhiên, nó không giống như các giá trị của bản đồ có thể là bất cứ điều gì khác hơn là Strings.

Tôi có đang tìm đúng nơi để có giải pháp cho nhu cầu của mình không? Ngay bây giờ, tôi thích khía cạnh trong bộ nhớ và master-slave của Redis, nhưng tôi thích khả năng đối tượng/tài liệu của OrientDB vì cấu trúc dữ liệu của tôi phức tạp hơn các chuỗi đơn giản và có thể sử dụng Trove với các kiểu khóa/giá trị nguyên thủy rất thuận lợi. Sẽ tốt hơn nếu đọc là rẻ và viết đắt tiền hơn là cách khác.

Suy nghĩ?

Trả lời

4

Tại sao không chỉ tuần tự hóa cấu trúc dữ liệu Trove trực tiếp vào đĩa? Dường như có một số loại hỗ trợ cho việc đánh giá bằng tài liệu (http://trove4j.sourceforge.net/javadocs/serialized-form.html), nhưng thật khó để nói bởi vì nó là tất cả các tự động tạo ra cruft thay vì hướng dẫn yêu thương. Tuy nhiên, đối với trường hợp sử dụng của bạn, nó không rõ ràng tại sao bạn cần một cơ sở dữ liệu thích hợp, vì vậy có lẽ KISS áp dụng.

+0

Cảm ơn, tôi thích câu trả lời này. Tôi đã bỏ qua điều đó trong tài liệu và tôi sẽ viết một số mã thử nghiệm để thử nó ngay bây giờ. Điều này có lẽ sẽ kết thúc là giải pháp tốt nhất. Nhược điểm, là tôi sẽ phải viết mã kiên trì của riêng tôi, nhưng cuối cùng ứng dụng của tôi sẽ được tối ưu hóa. Nếu tôi cố gắng giở nó vào một khung NoSQL, tôi có lẽ sẽ phải thỏa hiệp xấu. – herrtim

2

OrientDB có công cụ linh hoạt nhất với chỉ mục, biểu đồ, giao dịch và tài liệu phức tạp dưới dạng JSON. Tại sao không?

1

Nếu bạn muốn sử dụng Redis cho điều này, bạn có thể phù hợp nhất bằng cách sử dụng ZSET hoặc HASHes làm cấu trúc bên dưới (Redis hỗ trợ cấu trúc, không chỉ giá trị chuỗi). Trừ khi bạn cần phải lấy các phần của bản đồ của bạn dựa trên các giá trị/thứ tự sắp xếp của các giá trị, HASH có lẽ sẽ là tốt nhất (về mặt bộ nhớ và tốc độ).

Vì vậy, bạn có thể muốn sử dụng một thời gian dài -> {long: float, ...}. Tức là, hãy lập bản đồ cho các bản đồ dài/nổi. Sau đó, bạn có thể tìm nạp các mục nhập riêng lẻ trong bản đồ bằng HGET, nhiều mục nhập với HMGET hoặc bản đồ đầy đủ với HGETALL. Bạn có thể xem tham chiếu lệnh http://redis.io/commands

Về mặt tiết kiệm không gian, tùy thuộc vào kích cỡ mong muốn của HASHes, bạn có thể điều chỉnh chúng để sử dụng ít không gian hơn với giới hạn/không có tác động tiêu cực đến hiệu suất.

Trên mặt kiên trì của mọi thứ, bạn có thể chạy Redis bằng ảnh chụp nhanh hoặc sử dụng tính năng tiết kiệm gia tăng với các tệp chỉ nối thêm.Bạn có thể xem tài liệu kiên trì ở đây: http://redis.io/topics/persistence

Nếu bạn muốn đặt câu hỏi nhọn hơn, bạn nên đi qua các mailing list https://groups.google.com/forum/?fromgroups=#!topic/redis-db/33ZYReULius

+0

Cảm ơn câu trả lời chi tiết tuyệt vời. Tôi bắt đầu thấy Redis thực sự có thể làm việc như thế nào. Để có được điều này để làm việc với ứng dụng Java hiện tại của tôi, tôi có thể sử dụng dự án Jedis. Có vẻ như Jedis sẽ liên lạc với Redis qua một cổng. Tôi sẽ phải làm một số điểm chuẩn để so sánh một thực thi Java thuần túy với việc thực hiện Jedis/Redis để xem cái gì tốt hơn. – herrtim

2

Check-out Java-Chronicle. Đó là thư viện kiên trì độ trễ thấp. Tôi nghĩ bạn có thể thấy nó cung cấp hiệu suất tuyệt vời cho loại dữ liệu này.

+0

Điều này trông khá ấn tượng, đặc biệt là tốc độ ghi vào đĩa. Wow. Các tài liệu và ví dụ là khá thưa thớt mặc dù, và tôi không chắc chắn làm thế nào tôi có thể thực hiện bản đồ của tôi về bản đồ với nó. – herrtim

1

Redis hỗ trợ phức tạp hơn data structures so với các chuỗi đơn giản như danh sách, (sắp xếp) bộ hoặc băm có thể hữu ích cho mô hình miền của bạn. Mặt khác, mạng nơ-ron của bạn có thể tận dụng các khả năng đồ thị phong phú của OrientDB tùy thuộc vào cấu trúc của nó.

Các vấn đề liên quan