具有大型数据集的Python Redis hmset不会插入所有对象

时间:2019-02-21 07:34:41

标签: python redis

我有大约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-clihmget测试各种已知的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

0 个答案:

没有答案