Целочисленные значения в leveldb - PullRequest
3 голосов
/ 09 декабря 2011

Я хотел бы использовать leveldb для эффективного хранения целых чисел и целочисленных массивов, как на c ++, так и на python.

Для целых чисел в C ++ я мог бы преобразовать int в массив char.Любые предложения по хранению массива int в c ++ и массивов int и int в python?

Ответы [ 3 ]

1 голос
/ 27 января 2012

Вы могли бы рассмотреть возможность использования библиотеки, такой как protobuf от Google (http://code.google.com/p/protobuf/)), которая способна (де) сериализовать структурированные данные. Для случая, который вы упомянули, повторное поле поможет:

message List {
  repeated int64 val = 1;
}

Учитывая кодировку varint, используемую буферами протокола (и в зависимости от диапазона значений), это может быть эффективным способом хранения целых чисел.

http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints

Трудно сказать больше, не зная немного о вашем случае использования. Сколько целых чисел будет храниться в среднем на массив? Каков диапазон целочисленных значений? и т.д.

1 голос
/ 24 января 2012

Для массива int в c ++ вы должны передать массив int как char* в класс Slice, который затем можно легко поместить в базу данных leveldb, например,

int myArray[3] = {1,2,3};
Slice valueSlice = Slice( (const char*) myArray, sizeof(myArray) );

Это в основном верно для всех типов, а также для пользовательских классов, например

MyClass* newObj = new MyClass();
Slice valueSlice = Slice( (const char*) newObj, sizeof(MyClass) );
0 голосов
/ 06 декабря 2013

для python, struct может быть эффективным. Вот пример использования интерфейса ctypes leveldb из leveldb-py для хранения значения 1,2,3,4,5 (в виде массива целых чисел) в базе данных с ключом 100:

import leveldb,array,struct

#this assumes 32-bit unsigned integers in machine order
value=struct.pack('p',array('I',[1,2,3,4,5]))
key=struct.pack('I',100)

db=leveldb.DB("/path/to/db", create_if_missing=True)
db[key]=value

Для большей эффективности импортируйте определенные функции (например, "из пакета struct import") и используйте класс WriteBatch lelveldb, если у вас есть куча операций записи.

Можно ли хранить целочисленные ключи / значения в LevelDB? предполагает, что может потребоваться пользовательский компаратор, однако этот конкретный интерфейс Python leveldb этого не поддерживает. https://plyvel.readthedocs.org/en/latest/ может быть лучшим вариантом.

...