2010-03-05 8 views
8

Tôi hiện đang làm việc trên một vấn đề liên quan đến lập trình mà tôi đã cố gắng tạo một băm dữ liệu khổng lồ. Chìa khóa cho dữ liệu là việc triển khai bộ nhớ thấp tùy chỉnh của CharSequence thực hiện hashCode() và bằng (...) và giá trị là đối tượng Integer. Có thể có hàng triệu mục trong hashtable này và tôi quản lý để giảm đáng kể sử dụng bộ nhớ cho giá trị bằng cách có số nguyên là một con trỏ trong một tệp dữ liệu tôi muốn băm nhưng vấn đề là khóa có thể hàng chục byte (trung bình 25 byte) và rằng các phím cần phải được giữ trong bộ nhớ trong việc thực hiện mặc định của HashMap.Giới hạn băm bộ nhớ thấp được đề xuất để thực hiện cho Java

Tôi cần một bản đồ băm có chi phí bộ nhớ thấp và có thể trang các phím vào đĩa hoặc lưu trữ một cách khác một biểu diễn băm của các khóa. Nếu các khóa được tự băm thì tôi sẽ lo ngại về các xung đột băm.

Lý tưởng nhất, tôi muốn có thể lưu trữ một triệu mục trong bản đồ trên mỗi 50MB không gian heap (một mảng byte là 25 byte trong đối tượng khóa và Integer trong phần giá trị).

Có ai có bất kỳ trải nghiệm nào với Maps được sao lưu hệ thống tập tin có bộ nhớ thấp được tối ưu hóa để giảm dấu chân của các phím không?

Cảm ơn,

Chris

+0

không gian và thời gian thường trong mối quan hệ cân bằng. yêu cầu hiệu suất/khả năng mở rộng của bạn để thêm, tìm kiếm, xóa nút là gì? bạn có thể sử dụng một mảng nếu bạn chỉ muốn bộ nhớ thấp. –

+1

Loại âm thanh như bạn muốn có trong cơ sở dữ liệu bộ nhớ? –

Trả lời

3

Bạn có thể sử dụng bản đồ băm của Java và viết một lớp FileKey lấy một giá trị RandomAccessFile, offset và length, tính toán giá trị băm khi xây dựng và thực hiện Comparable bằng cách đọc dữ liệu từ tệp chỉ để so sánh.

Kết hợp với bộ đệm MRU đơn giản, bạn có thể giữ một số khóa trong bộ nhớ bằng cách sử dụng một băm khác được khóa trên cùng một khóa, nhưng sử dụng bộ so sánh tùy chỉnh so sánh giá trị độ dài và độ lệch (không phải tệp dữ liệu).

2

Làm thế nào về Berkeley DB Java Edition? Lớp StoredMap của nó trông giống như những gì bạn đang tìm kiếm.

1

Tôi nghĩ rằng mặc định HashSet không phải là một cách xấu để đi - làm cho cặp khóa-giá trị chính mình (vì vậy bạn không cần phải quấn chúng trong một đối tượng bổ sung). Nó là khá bộ nhớ hiệu quả theo cách đó; nó thực sự chỉ yêu cầu về (1/loadFactor)^(3/2) * 4 byte bộ nhớ nhiều hơn trên đối tượng chính của bạn + 4 byte cho giá trị. Trong thực tế, điều này nên thêm một cái gì đó giống như 8 byte trên không cho mỗi mục. (Bạn có thể giảm thêm điều này nếu bạn biết trước số lượng khóa bạn sẽ lưu trữ.)