leveldb 中的整数值
我想使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
对于 python,struct 可以是高效的。以下是使用 leveldb-py 中的 ctypes leveldb 接口存储值 1 的示例,2,3,4,5(作为整数数组)在数据库中的键为 100:
为了提高效率,导入特定函数(例如“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:
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.
您可以考虑使用像 Google 的 protobuf (http://code.google.com/p/protobuf/) 这样的库,它能够(反)序列化结构化数据。对于您提到的情况,重复字段可以解决问题:
考虑到协议缓冲区使用的 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:
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.
对于 C++ 中的
int
数组,您必须将int
数组作为char*
传递给 Slice 类,然后您可以轻松地将其放入leveldb 数据库,例如这基本上对所有类型以及自定义类有效,例如
For an
int
array in c++ you have to pass theint
array as achar*
to the Slice class, which you can then easily put to the leveldb database, e.g.This is basically valid for all types as well as custom classes, e.g.