leveldb 中的整数值

发布于 2024-12-20 10:18:22 字数 143 浏览 3 评论 0原文

我想使用 leveldb 在 c++ 和 python 中有效地存储整数和整数数组。

对于 C++ 中的整数,我可以将 int 转换为 char 数组。对于在 C++ 中存储 int 数组以及在 python 中存储 int 和 int 数组有什么建议吗?

I would like to use leveldb to store integers and integer arrays efficiently, in both c++ and python.

For integers in C++, i could convert the int to a char array. Any suggestions for storing the int array in c++ and int and int array in python?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

墨离汐 2024-12-27 10:18:23

对于 python,struct 可以是高效的。以下是使用 leveldb-py 中的 ctypes leveldb 接口存储值 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

为了提高效率,导入特定函数(例如“from struct import pack”)并使用 leveldb 的 WriteBatch 类,如果您有一堆写入要做。

整数键/值可以存储在 LevelDB 中吗? 建议可能需要自定义比较器,但是这个特定的 Python leveldb 接口不支持它。 https://plyvel.readthedocs.org/en/latest/ 可能是更好的选择。

for python, struct can be efficient. Here is an example using the ctypes leveldb interface from leveldb-py storing the value 1,2,3,4,5 (as an array of integers) in the database with key 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

For more efficiency, import the specific functions (e.g. "from struct import pack") and use the lelveldb's WriteBatch class, if you have a bunch of writes to do.

Can integer keys / values be stored in LevelDB? suggests that a custom comparator may be needed, however this particular Python leveldb interface doesn't support that. https://plyvel.readthedocs.org/en/latest/ may be a better option.

浅唱ヾ落雨殇 2024-12-27 10:18:22

您可以考虑使用像 Google 的 protobuf (http://code.google.com/p/protobuf/) 这样的库,它能够(反)序列化结构化数据。对于您提到的情况,重复字段可以解决问题:

message List {
  repeated int64 val = 1;
}

考虑到协议缓冲区使用的 varint 编码(并且取决于您的值范围),这可能是存储整数的有效方法。

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

如果不了解更多关于您的用例的信息,很难说更多。每个数组平均要存储多少个整数?整数值的范围是多少? ETC。

You could consider using a library like Google's protobuf (http://code.google.com/p/protobuf/) which is capable of (de)serializing structured data. For the case you mention, a repeated field would do the trick:

message List {
  repeated int64 val = 1;
}

Given the varint encoding used by protocol buffers (and depending on your range of values) this could be an efficient way to store the integers.

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

It is tough to say more without knowing a bit more about your use case. How many integers are going to be stored per array on average? What is the range of integer values? etc.

感情洁癖 2024-12-27 10:18:22

对于 C++ 中的 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) );

For an int array in c++ you have to pass the int array as a char* to the Slice class, which you can then easily put to the leveldb database, e.g.

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

This is basically valid for all types as well as custom classes, e.g.

MyClass* newObj = new MyClass();
Slice valueSlice = Slice( (const char*) newObj, sizeof(MyClass) );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文