我有大约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文本文件中的每330万行中提取的字符串。
问题
我的问题是,当我一次执行此导入操作时,没有任何异常,但是在导入结束时有一些对象(实际上是一个相当大的数字)没有放入数据库中。
换句话说,当我打开redis-cli
以hmget
测试各种已知的record['name']
名称时,某些记录将正确返回,而某些记录将返回(nil)
,这是不正确的。
hmset
失败,导致这些(nil)
记录,但是在导入阶段未引发任何异常。 (至少,不会引发触发try..catch
块的异常。)
我尝试过的事情
如果我将集合分解成较小的导入,例如每次导入100k个对象,则Python脚本可以工作。
如果在导入期间我在另一个终端中打开了redis-cli
,并且如果我运行LASTSAVE
来跟踪保存,则似乎在导入期间每分钟左右执行一次保存到Redis数据库的操作。
问题
我可以怎么做才能使Redis hmset
在Python下稳定运行以进行完全导入,或者如果原因是其他原因,如何调试此问题?
通过Python(例如,每N条记录)插入哈希条目时,是否需要定期保存数据库?
导入大数据集是否需要最少的内存?该主机具有2GB的内存,我已将其中的1GB分配给Redis服务器。导入时就足够了吗?读取,解析记录并一次hmset
一条记录。
我在做什么
我正在使用:Redis服务器5.0.3
和运行3.6.7
API库的Ubuntu 18上的Python redis-3.2.0
。