2009-10-08 41 views
22

Tôi cần cấu trúc Bản đồ được sao lưu trên đĩa để sử dụng trong ứng dụng Java. Nó phải có các tiêu chuẩn sau:Đề xuất Bản đồ liên tục nhanh và có thể mở rộng - Java

  1. Có khả năng lưu trữ hàng triệu bản ghi (thậm chí hàng tỷ)
  2. Nhanh tra cứu - đa số các hoạt động trên Bản đồ sẽ chỉ đơn giản là để xem nếu một chìa khóa đã tồn tại. Điều này, và 1 ở trên là các tiêu chí quan trọng nhất. Nên có một hiệu quả trong cơ chế bộ nhớ đệm cho các phím thường được sử dụng.
  3. Liên tục, nhưng không cần phải giao dịch, có thể bị lỗi. tức là đồng bộ với đĩa định kỳ và không cần phải giao dịch.
  4. Có khả năng lưu trữ các loại nguyên thủy đơn giản - nhưng tôi không cần lưu trữ các đối tượng được tuần tự hóa.
  5. Nó không cần phải được phân phối, tức là sẽ chạy tất cả trên một máy.
  6. Đơn giản để thiết lập & miễn phí để sử dụng.
  7. Không có truy vấn quan hệ nào được yêu cầu

Phím ghi sẽ là chuỗi hoặc thời lượng dài. Như được mô tả ở trên lần đọc sẽ thường xuyên hơn nhiều so với viết và phần lớn các lần đọc sẽ chỉ đơn giản là kiểm tra xem một khóa có tồn tại hay không (tức là không cần phải đọc các khóa liên quan đến dữ liệu). Mỗi bản ghi sẽ chỉ được cập nhật một lần và các bản ghi sẽ không bị xóa.

Tôi hiện đang sử dụng Bdb JE nhưng đang tìm kiếm các tùy chọn khác.


Cập nhật

Có từ hiệu suất truy vấn cải tiến về thiết lập BDB hiện tại của tôi bằng cách giảm sự phụ thuộc vào các phím thứ yếu. Một số truy vấn yêu cầu tham gia vào hai khóa phụ và bằng cách kết hợp chúng thành khóa tổng hợp, tôi đã loại bỏ mức độ gián đoạn trong quá trình tra cứu nhằm tăng tốc độ cho mọi thứ một cách độc đáo.

+0

Một tùy chọn tôi đang xem xét đang thay đổi cách tôi sử dụng triển khai BDB hiện tại của mình. Hiện tại tôi có một cơ sở dữ liệu lớn cho tất cả hồ sơ của mình. Tuy nhiên, tôi có thể phân vùng dữ liệu thành các bộ và có một cơ sở dữ liệu cho mỗi bộ - nếu tôi biết rằng tại bất kỳ thời điểm nào tôi sẽ chỉ cần truy cập vào một số bộ nhất định thì tôi có thể tiếp tục đóng những bộ tôi không sử dụng, điều này sẽ giúp bdb quản lý dữ liệu hiệu quả hơn cho tôi. – Joel

+0

Tôi đã sử dụng bdb je. cho tiêu chí của bạn, nó rất phù hợp. Tuy nhiên, tôi đã thực sự thất vọng với sự mong manh của nó, và sẽ không khuyên bạn nên nó để sử dụng sản xuất. bất kỳ trục trặc trong quá trình java gây ra các hệ thống con bdb để yêu cầu khởi động lại, blech! – james

+0

Tôi không chắc chắn ý của bạn là "sự mong manh" của BDB JE. BDB JE có thể mở rộng thành Terabyte dữ liệu và tôi sử dụng nó trong các hệ thống sản xuất mọi lúc. Đó là một công nghệ tuyệt vời. – jasonmp85

Trả lời

3

Tôi có thể sử dụng cơ sở dữ liệu cục bộ. Giống như nói Bdb JE hoặc HSQLDB. Tôi có thể hỏi những gì là sai với cách tiếp cận này? Bạn phải có một số lý do để tìm kiếm giải pháp thay thế.

Để trả lời nhận xét: Khi thực hiện vấn đề và tôi đoán bạn đã sử dụng JDBC để xử lý việc này có thể đáng thử HSQLB và đọc chương trên Memory and Disk Use.

+1

+1 đồng ý. Tôi sẽ sử dụng một DB thường xuyên và viết một API tốt đẹp cho các yêu cầu để backend có thể được chuyển dễ dàng. – flybywire

+0

Khi Bdb đạt đến giới hạn của những gì có thể được lưu trữ trong bộ nhớ, tôi thấy rằng nó làm chậm không thể chấp nhận được. Điều này thường xảy ra sau khi chèn khoảng 1mm. – Joel

+0

Làm thế nào về HSQLDB? Tôi sẽ đoán cả hai JDBC, do đó bạn sẽ có thể khe nó mà không sửa đổi nhiều mã hiện tại của bạn. Sẽ đáng đọc: http://hsqldb.org/doc/2.0/guide/deployment-chapt.html#deployment_mem_disk-sect –

0

Tôi nghĩ rằng Hibernate Shards có thể dễ dàng đáp ứng tất cả các yêu cầu của bạn.

1

SQLite thực hiện việc này. Tôi đã viết một trình bao bọc để sử dụng nó từ Java: http://zentus.com/sqlitejdbc

Như tôi đã đề cập trong một nhận xét, tôi đã sử dụng thành công SQLite với gigabyte dữ liệu và bảng của hàng trăm triệu hàng. Nếu bạn nghĩ ra việc lập chỉ mục đúng cách, nó rất nhanh.

Sự đau đớn duy nhất là giao diện JDBC. So với một HashMap đơn giản, nó là clunky. Tôi thường kết thúc viết một trình bao bọc JDBC cho dự án cụ thể, có thể thêm tối đa rất nhiều mã soạn sẵn.

+0

Tôi nghiêm túc nghi ngờ sqlite sẽ mở rộng đến nhiều hồ sơ này. –

+1

Tôi đã sử dụng thành công SQLite với gigabyte dữ liệu và bảng của hàng trăm triệu hàng. Nếu bạn nghĩ ra việc lập chỉ mục đúng cách, nó rất nhanh. –

0

JBoss (tree) Cache là một tùy chọn tuyệt vời. Bạn có thể sử dụng nó độc lập từ JBoss. Rất mạnh mẽ, hiệu suất và linh hoạt.

+1

Có ổn định không? –

1

Tôi đã tìm thấy Tokyo Cabinet là một Hash/Map liên tục đơn giản và nhanh chóng để thiết lập và sử dụng.

dụ viết tắt này, lấy từ the docs, cho thấy cách đơn giản nó là để lưu và lấy dữ liệu từ một bản đồ liên tục:

// create the object 
    HDB hdb = new HDB(); 
    // open the database 
    hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT); 
    // add item 
    hdb.put("foo", "hop"); 
    hdb.close(); 
19

JDBM3 thực hiện chính xác những gì bạn đang tìm kiếm. Nó là một thư viện các bản đồ được sao lưu đĩa với API thực sự đơn giản và hiệu suất cao.

CẬP NHẬT

Dự án này hiện nay đã phát triển thành MapDB http://www.mapdb.org

6

Bạn có thể thử Java Chronicles từ http://openhft.net/products/chronicle-map/ Chronicle Map là một hiệu suất cao, off-heap, giá trị khóa, trong bộ nhớ, vẫn kiên trì kho dữ liệu. Nó hoạt động giống như một bản đồ java chuẩn

+1

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – Cyclonecode

+2

@krister - Tôi nghĩ đây là trường hợp câu hỏi ít lý tưởng tạo ra câu trả lời vi phạm chính sách của SO (câu trả lời đã làm tốt công việc trả lời câu hỏi). Trong trường hợp này, tôi có xu hướng chuyển sang câu hỏi. – jww

2

Tính đến hôm nay tôi sẽ sử dụng MapDB (dựa trên tập tin/được đồng bộ hóa hoặc đồng bộ hóa) hoặc Hazelcast. Về sau bạn sẽ phải thực hiện sự kiên trì của riêng bạn, tức là được hỗ trợ bởi một RDBMS bằng cách thực hiện một giao diện Java. OpenHFT biên niên sử có thể là một lựa chọn khác. Tôi không chắc chắn làm thế nào sự bền vững hoạt động ở đó vì tôi không bao giờ sử dụng nó, nhưng yêu cầu bồi thường để có một. OpenHFT là hoàn toàn tắt heap và cho phép cập nhật một phần của các đối tượng (của nguyên thủy) mà không có (de-) serialization, mà có thể là một lợi ích hiệu suất.

GHI CHÚ: Nếu bạn cần đĩa bản đồ của mình dựa trên các vấn đề về bộ nhớ, tùy chọn đơn giản nhất là MapDB. Hazelcast có thể được sử dụng làm bộ đệm (được phân phối hay không) cho phép bạn loại bỏ các phần tử khỏi đống sau thời gian hoặc kích thước. OpenHFT là tắt heap và có thể được xem xét nếu bạn chỉ cần kiên trì cho jvm khởi động lại.

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