2012-01-10 25 views

Trả lời

10

Bạn có thể lưu trữ khá nhiều thứ trong LevelDB. Bạn cung cấp các mảng dữ liệu mờ đục vào LevelDB thông qua cấu trúc Slice. Dưới đây là ví dụ:

int intKey = 256; 
int intValue = 256*256; 

Slice key((char*)&intKey, sizeof(int)); 
Slice value((char*)&intValue, sizeof(int)); 

db->Put(leveldb::WriteOptions(), key, value); 

Và đó là khá nhiều!

Tuy nhiên, có một điều cần lưu ý là trong khi nó nói chung là tốt để lưu trữ các số nguyên trong LevelDB (như cả khóa và giá trị), họ sẽ có trật tự thông qua BytewiseComparator để khóa của bạn có hỗ trợ bytewise so sánh. Điều này cũng có nghĩa là nếu bạn dựa vào thứ tự cụ thể của các khóa, thì bạn phải chú ý đến sự kết thúc của hệ thống.

Bạn cũng có thể viết trình so sánh của riêng mình qua giao diện Comparator cho phép bạn thay thế mặc định BytewiseComparator.

+0

Nhưng lệnh Get doesnt cung cấp cho tôi slice phải không? Nếu dữ liệu không được '0' đệm thì nó sẽ hoạt động như thế nào? Hoặc tôi đang thiếu một cái gì đó ở đây? – vinothkr

+0

Nhận trả về một chuỗi std :: có thể chứa một mảng byte tùy ý. Bạn cũng có thể sử dụng một Iterator và tìm kiếm nó, để có thể nhận được một Slice trỏ đến giá trị mà không cần sao chép bất kỳ. Đây là phương pháp được khuyến nghị cho các giá trị rất lớn. –

1

Trong nhiều trường hợp, một lược đồ mã hóa phức tạp hơn cho các phím số nguyên là một lựa chọn tốt hơn. Đóng gói một int vào biểu diễn hai bổ sung của nó trong một char * (như được đề xuất trong câu trả lời khác cho câu hỏi này) là một lựa chọn; varint encoding là một số khác (tiết kiệm không gian cho các số nguyên nhỏ, có thể lưu trữ các số tùy ý mà không có giới hạn trên).

+0

Không phải là phương pháp tối ưu hóa phương pháp hai bổ sung? – amirouche

+1

không. varints (trong đó có nhiều biến thể) sử dụng một kích thước biến, trong khi hai số bổ sung sử dụng một kích thước cố định. điều này có nghĩa là các varints về mặt lý thuyết không bị ràng buộc (nhưng không phải trong các triển khai thực tế), trong khi các số hai bổ sung có phạm vi từ -2^n đến 2^n-1. Ngoài ra, varints cần mã hóa zigzag cho số âm, trong khi 2 bổ sung dự trữ một chút dấu hiệu cho điều đó. –

0

Để mở rộng câu trả lời của Link, một phần vì tôi đã chơi chính xác như một phần của cuốn sách tôi đang viết, bạn có thể thấy kết quả của BytewiseComparator mà anh ta/cô ấy nói về bên dưới.

Cách tiếp cận khác là lật các số nguyên nhị phân của bạn sang định dạng cuối lớn để chúng sắp xếp OK với bộ so sánh mặc định. Điều này giúp tạo các khóa dễ dàng hơn. long flippedI = htonl(i);

Lưu ý rằng LevelDB rất nhanh. Tôi đã thực hiện các thử nghiệm trên iPhone4 với 50.000 bản ghi có khóa văn bản với các khóa phụ, do đó, khoảng 100.000 cặp khóa/giá trị và nó hét lên.

Nó rất dễ dàng để viết một so sánh tùy chỉnh được sử dụng bởi cơ sở dữ liệu của bạn mãi mãi và vẫn sử dụng ByteWiseComparator cho các phím khác với số của bạn. Vấn đề lớn nhất là quyết định khóa nào được bao phủ bởi các quy tắc tùy chỉnh của bạn hay không.

Một cách tầm thường là nói rằng tất cả các khóa không phải số nguyên dài hơn 4 ký tự để bạn giả sử khóa 4 byte là số nguyên. Điều đó có nghĩa là bạn chỉ cần đảm bảo rằng bạn thêm dấu cách hoặc thứ gì khác để đẩy điều đó. Đó là tất cả rất tùy ý và tùy thuộc vào bạn nhưng hãy nhớ rằng chỉ có hai mẩu thông tin bạn có là nội dung chính và độ dài của nó. Không có siêu dữ liệu nào khác cho một khóa nhất định.

Một phần của kết quả từ một mẫu để so sánh tiêu chuẩn với int phím bắt đầu từ 1 và đi lên bằng 1-1000, sử dụng một cơ sở dữ liệu với BytewiseComparator chuẩn

Listing the keys in decimal and hex 
256 (100) 
512 (200) 
768 (300) 
    1 ( 1) 
257 (101) 
513 (201) 
769 (301) 
    2 ( 2) 
258 (102) 
514 (202) 
770 (302) 
    3 ( 3) 
259 (103) 
515 (203) 
771 (303) 
... 
254 ( fe) 
510 (1fe) 
766 (2fe) 
255 ( ff) 
511 (1ff) 
767 (2ff) 
+0

Bạn có nghĩa là lật vào thứ tự lớn, không phải là người ít tuổi. Bạn đã sử dụng "htonl" trong ví dụ của bạn có nghĩa là "lưu trữ mạng" và thứ tự byte mạng là kết thúc lớn. LevelDB có thể nhanh hơn so với các cơ sở dữ liệu cũ hơn, nhưng nó khá chậm so với LMDB. – hyc

+0

Cảm ơn sự chỉnh sửa về tính cuối cùng. –

0

LMDB đã hỗ trợ rõ ràng cho các phím số nguyên (và giá trị, nếu bạn đang sử dụng trùng lặp được sắp xếp). http://symas.com/mdb

Khi DB được cấu hình cho khóa nguyên, các hàm so sánh chính cũng nhanh hơn nhiều vì chúng có thể so sánh từ-at-a-time thay vì chỉ byte-tại-một-thời gian làm.

Tuyên bố từ chối trách nhiệm: Tôi là tác giả của LMDB. Tất nhiên, điều đó không làm cho sự thật khác biệt.

+1

Câu hỏi đặt ra là về LevelDB. Vui lòng ngừng gửi spam các câu hỏi khác cố gắng quảng bá LMDB. –

+0

Câu hỏi cho biết "Tôi đã tìm kiếm" có nghĩa là anh ấy vẫn đang tìm kiếm các tùy chọn. Và LevelDB là một lựa chọn kém minh bạch, và LMDB là một lựa chọn cao cấp. – hyc

+0

@hyc thay vì phụ thuộc vào yêu cầu của bạn. Tôi vừa xem xét LMDB và thấy nó hoàn toàn không phù hợp, nhưng LevelDB dường như chỉ làm những gì tôi cần. – Alnitak

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