Целочисленные значения в leveldb

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

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


person Ash    schedule 08.12.2011    source источник


Ответы (3)


Вы можете рассмотреть возможность использования библиотеки, такой как 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

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

person ahochhaus    schedule 27.01.2012

Для массива int в С++ вы должны передать массив 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) );
person ezdazuzena    schedule 24.01.2012

для 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

Для большей эффективности импортируйте определенные функции (например, «из пакета импорта структур») и используйте класс WriteBatch leveldb, если вам нужно выполнить множество операций записи.

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

person Brian Minton    schedule 06.12.2013
comment
Если вы просто используете leveldb в качестве хранилища ключей и значений, вам не нужен специальный компаратор. - person Brian Minton; 06.12.2013