我有一对 (key,value),其中包含 key = string 和 value = int。我尝试从大型文本语料库构建索引,因此我存储了字符串和标识符。对于我从语料库中读取的每个术语,我都必须检查索引以查看它是否存在,因此我需要快速查找(如果可能的话 O(1))。我正在使用 python 字典来创建索引。问题是我用完了 Ram(16GB Ram)。我的替代方法是使用字典,当我的 ram 使用率达到 90% 时,我正在使用 sqlite3 数据库将对存储到磁盘。但是现在的问题是查找时间太长了(先查dict,不行再查磁盘上的数据库)。
我正在考虑切换到 Redis-db。我的问题是,我应该将键值存储为字符串还是应该散列它们然后存储它们? (键是包含(2~100 个字符)的字符串。那么值呢,我应该对它们尝试任何操作吗(值是 int32 数字)?
编辑:
我想存储每个术语及其标识符(唯一对),如果我读取了一个术语并且它存在于索引中,则将其传递。
编辑2:
我尝试使用 redis 但它似乎真的很慢 (?)太慢了。有什么建议吗?
最佳答案
可以很容易地用 C 哈希模拟 Python 字典。 Glib 提供了一个有效的散列实现,通过一些 C 培训不难使用。优点是它会比 Python 字典更快并且(更少)占用内存:
https://developer.gnome.org/glib/2.40/glib-Hash-Tables.html
您还可以添加一些算法来提高性能。例如存储压缩 key 。
更简单的是,您可以将大型文本语料库分段,为每个部分创建一个独立的索引,然后“合并”这些索引。
因此,例如索引 1 将如下所示:
key1 -> page 1, 3, 20
key2 -> page 2, 7
...
索引 2:
key1 -> page 50, 70
key2 -> page 65
...
然后你可以合并索引 1 和 2:
key1 -> page 1, 3, 20, 50, 70
key2 -> page 2, 7, 65
...
您甚至可以并行化到 N 台机器上。
关于python - 数百万对的 Redis/Dictionaries/sqlite3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24844324/