python - 具有大型数据集的 Python Redis hmset 不会插入所有对象
问题描述
我有大约 330 万个对象,我想通过以下伪代码将它们插入到 Redis 哈希中:
import redis
import json
r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)
try:
for record in records:
serialized_record = { 'record' : json.dumps(record) }
r.hmset(record['name'], serialized_record)
catch redis.exceptions.RedisError as e:
...
catch redis.exceptions.DataError as e:
...
我在这里省略了相当多的细节,但这是我正在做的事情的要点。
在这种情况下,record['name']
键及其值对只是取自约 1.5GB 文本文件中 3.3M 行中的每一行的字符串。
问题
我的问题是,当我一次运行此导入时,我没有遇到任何异常,但是在导入结束时的一些对象(实际上是一个公平的数字)没有被放入数据库中。
也就是说,当我打开redis-cli
测试hmget
各种已知record['name']
名称时,有些记录会正确返回,有些记录会返回(nil)
,这是不正确的。
hmset
导致这些记录的失败(nil)
,但在导入阶段没有抛出异常。(至少,不会引发触发try..catch
块的异常。)
我试过的
如果我将我的集合分解为较小的导入,例如每次导入 100k 个对象,那么 Python 脚本就可以工作。
如果我redis-cli
在导入期间在另一个终端中打开,并且如果我运行LASTSAVE
以跟踪保存,则在导入期间似乎每分钟左右执行一次到 Redis 数据库的保存。
问题
我该怎么做才能使 Redishmset
在 Python 下稳健地工作以进行完全导入,或者如果原因在其他地方,我该如何调试这个问题?
当我通过 Python 插入哈希条目时,是否需要定期保存数据库(例如,每 N 条记录)?
导入大型数据集是否需要最小内存量?这台主机有 2GB 内存,我已将其中的 1GB 分配给 Redis 服务器。导入时这样就够了吗?记录被读入,解析,hmset
一次一个记录。
我正在运行什么
我正在使用:Redis 服务器和运行API 库的 Ubuntu 18 上的5.0.3
Python 。3.6.7
redis-3.2.0
解决方案
推荐阅读
- doxygen - 使正确的 doxygen 文档成为构建要求
- google-cloud-storage - 谷歌云存储浏览器转义空间
- token - 获取以太坊 ERC-20 代币信息的正确方法
- node.js - 我无法通过名称连接到我的 mongo docker 容器
- python - 无法连接到本地主机python
- for-loop - Verilog 代码:使用嵌套 for 循环初始化二维数组
- html - Angular:如何更改 *ngFor 循环创建的特定表行中的图像
- html - 如何用 CMD 中的变量替换字符?
- c - 我们可以返回非指向指针函数的值吗
- origen-sdk - 包装 Origen::Parameters 的 define_params 方法