首页 > 解决方案 > 具有大型数据集的 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.3Python 。3.6.7redis-3.2.0

标签: pythonredis

解决方案


推荐阅读