2010-09-30 38 views
7

Tôi đang tìm cấu trúc băm liên tục trong java, một kho khóa-giá trị đơn giản, trong đó khóa là một chuỗi và giá trị duy nhất là một int. Giá trị của một khóa được tăng lên mỗi lần một khóa hiện có được thêm vào cửa hàng.Java: cấu trúc băm liên tục lớn?

Tôi cần điều này là khá lớn - có thể là các khóa 500m - 1bn. Tôi đã đánh giá tokyo-cabinet http://fallabs.com/tokyocabinet/javadoc/ nhưng không chắc chắn nó sẽ mở rộng như thế nào - thời gian chèn dường như nhận được lâu hơn khi băm tăng lên.

Bất kỳ ý tưởng nào về điều gì có thể phù hợp?

Cảm ơn

Edit: Để giảm đĩa I/O Tôi sẽ được bộ nhớ đệm dữ liệu trong một HashMap trong bộ nhớ, sau đó cập nhật các hash dai dẳng trong một đi khi bộ nhớ cache để phát triển một kích thước nhất định.

Chỉnh sửa2: Một trong những lý do cho sự kiên trì là tôi có RAM giới hạn, 4GB, vì vậy tôi không thể phù hợp với một cấu trúc lớn vào bộ nhớ.

+0

Câu hỏi thú vị. –

+0

Bạn có loại vấn đề sẽ bị giới hạn bởi lựa chọn phần cứng của bạn. Bạn nên thiết kế phần mềm của bạn để làm việc xung quanh giới hạn này, tuy nhiên bạn đã chỉ cho phép mình 4 byte cho mỗi mục bạn sẽ phải chịu bởi vì hiệu suất đĩa của bạn có thể chậm hơn 1000 lần so với bộ nhớ chính. –

Trả lời

5

Tôi điều Megamap là những gì bạn đang tìm kiếm: http://megamap.sourceforge.net/. Đây là một mô tả ngắn về Megamap từ trang chủ của nó:

MegaMap là một thực hiện Java của một bản đồ (hoặc Hashtable) có thể lưu trữ một lượng vô biên của dữ liệu, chỉ bị giới hạn bởi số lượng không gian đĩa có sẵn . Các đối tượng được lưu trữ trên bản đồ là được lưu vào đĩa. Hiệu suất tốt là đạt được bằng bộ nhớ cache trong bộ nhớ. MegaMap có thể, cho tất cả các lý do thực tế , được coi là bản đồ triển khai với bộ nhớ không giới hạn không gian.

+0

Trông thú vị, tôi sẽ kiểm tra xem nó, cảm ơn –

+0

Cảm ơn một lần nữa cho đề nghị - nhưng trông unmaintained - đã không được cập nhật từ năm 2005: ( –

+0

Tôi sẽ xem qua ehcache hoặc các thư viện terracota khác, có lẽ một trong số đó có thể giúp bạn. MegaMap được phát triển trên đỉnh của ehcache, vì vậy nó là một hướng tốt để tìm kiếm. – Skarab

2

Sử dụng cơ sở dữ liệu không phải là băm. Ngay cả đối với một cơ sở dữ liệu 500M hàng đang nhận được khá lớn. Có bao nhiêu bản cập nhật bạn mong đợi mỗi giây?

+0

Liệu một NoSQL db có phù hợp không - MongoDB chẳng hạn? Đây thực chất là một kho khóa-giá trị đúng không? –

0

Vì vậy, nếu tôi hiểu chính xác, Redis có thể là một tùy chọn. Bạn có thể phát hành các lệnh INCR [key] để tăng giá trị nguyên tử liên quan đến khóa đó một cách nguyên tử. Nếu khóa không tồn tại, nó được đặt thành 0 và sau đó tăng lên (kết quả là một). Theo số docs, INCR là hoạt động liên tục. Tốc độ là mục tiêu thiết kế chính cho Redis.

Redis có thể tự lưu vào tệp và bạn có thể kiểm soát các thông số về cách điều đó xảy ra.

+0

Âm thanh như Redis có thể phải khớp hoàn toàn trong bộ nhớ.Từ các ghi chú "Để được rất nhanh nhưng đồng thời liên tục toàn bộ số liệu được lấy trong bộ nhớ". Tôi bị giới hạn bởi RAM 4GB. –

+0

Nó có khả năng bộ nhớ ảo, http://code.google.com/p/redis/wiki/VirtualMemoryUserGuide. Nó cũng không phải chạy cục bộ trên cùng một máy chủ như JVM của bạn. Tất nhiên, nó phụ thuộc vào tự do mà tổ chức của bạn cung cấp cho bạn về những gì bạn có thể cài đặt trong môi trường sản xuất của mình ... – romacafe

+0

Vâng, có cảnh báo này: "CẢNH BÁO: Vì các phím không thể hoán đổi, Redis sẽ không có thể tôn trọng cài đặt vm-max-memory nếu chỉ riêng các phím đang sử dụng nhiều không gian hơn giới hạn. " Tôi đoán rằng quy tắc ra Redis cho bạn, trừ khi bạn chỉ nhận được một hộp thực sự lớn để chạy nó trên ... – romacafe

0

Tôi nghĩ rằng Memcached là lựa chọn tốt cho trường hợp của bạn cùng với cơ sở dữ liệu phù hợp trong chương trình phụ trợ.

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