2011-12-08 6 views
3

Je voudrais utiliser leveldb pour stocker efficacement des entiers et des tableaux entiers, aussi bien en C++ qu'en python.Valeurs entières dans leveldb

Pour les entiers en C++, je pourrais convertir l'int en un tableau char. Des suggestions pour stocker le tableau int dans C++ et int et int array dans python?

Répondre

0

Pour un tableau int en C++ vous devez passer le tableau int comme char* à la classe de tranche, que vous pouvez ensuite facilement mettre à la base de données de LevelDB, par exemple

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

Ceci est fondamentalement valable pour tous les types ainsi que pour les classes personnalisées, par ex.

MyClass* newObj = new MyClass(); 
Slice valueSlice = Slice((const char*) newObj, sizeof(MyClass)); 
1

Vous pouvez envisager d'utiliser une bibliothèque comme la protobuf de Google (http://code.google.com/p/protobuf/) qui est capable de (de) sérialisation des données structurées. Pour le cas que vous mentionnez, un champ répété ferait l'affaire:

message List { 
    repeated int64 val = 1; 
} 

Compte tenu de l'encodage varint utilisé par des tampons de protocole (et en fonction de votre plage de valeurs), cela pourrait être un moyen efficace de stocker les entiers.

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

Il est difficile d'en dire plus sans savoir un peu plus sur votre cas d'utilisation. Combien d'entiers vont être stockés par matrice en moyenne? Quelle est la plage de valeurs entières?

0

pour python, struct peut être efficace. Voici un exemple utilisant les ctypes l'interface de leveldb-py mémoriser la valeur 1,2,3,4,5 (comme un tableau d'entiers) dans la base de données avec la clé 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 

Pour plus d'efficacité, importer le des fonctions spécifiques (par exemple "from struct import pack") et utilisez la classe WriteBatch de lelveldb, si vous avez un tas d'écritures à faire.

Can integer keys/values be stored in LevelDB?Can integer keys/values be stored in LevelDB? suggère qu'un comparateur personnalisé peut être nécessaire, mais cette interface Python leveldb particulière ne le supporte pas. https://plyvel.readthedocs.org/en/latest/ peut être une meilleure option.

+0

Si vous utilisez simplement leveldb comme magasin de valeurs-clés, vous n'avez pas besoin de comparateur personnalisé. –

Questions connexes