python - 数百万对的 Redis/Dictionaries/sqlite3

标签 python database dictionary redis

我有一对 (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

GLib Hash Table Loop Problem

您还可以添加一些算法来提高性能。例如存储压缩 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/

相关文章:

python - python pymysql.cursors如何从mysql存储过程获取INPUT返回结果

python - Python 中的二进制相移键控

python - 从 Pandas Timedelta 获取总小时数?

javascript - 浓缩系列 mySQL 查询

Python3 判断两个字典是否相等

python - 遵循 django 教程时出现错误

json - 在哪里存储大量的 JSON 文件

mysql - MYSQL存储过程中动态选择列的Using Case

arrays - 在字典数组中查找键值对

javascript - d3 voronoi arc Map - 控制.arcs的属性