【发布时间】:2018-12-11 20:34:52
【问题描述】:
所以我有一个字典,它是我从 Redis 获取的哈希对象,类似于以下字典:
source_data = {
b'key-1': b'{"age":33,"gender":"Male"}',
b'key-2': b'{"age":20,"gender":"Female"}'
}
我的目标是从该字典中提取所有值,并将它们作为 Python 字典列表,如下所示:
final_data = [
{
'age': 33,
'gender': 'Male'
},
{
'age': 20,
'gender': 'Female'
}
]
我尝试使用 json 解析进行列表理解:
import json
final_data = [json.loads(a) for a in source_data.values()]
它可以工作,但对于大型数据集,它需要太多时间。
我切换到使用这个 3rd 方 json 模块 ujson 根据这个 benchmark 更快,但我没有注意到任何改进。
我尝试使用多线程:
pool = Pool()
final_data = pool.map(ujson.loads, source_data.values(), chunksize=500)
pool.close()
pool.join()
我玩了一点chunksize,结果还是一样,还是太费时间了。
如果有人可以建议其他解决方案或改进以前的尝试,那将非常有帮助,如果我可以避免使用循环,那将是理想的。
【问题讨论】:
-
也许值得尝试 pypy?
-
需要多长时间,您的数据源有多大?
-
@TomDalton 目前无法尝试 pypy。
-
多处理在这里更有可能阻碍而不是帮助。你想反序列化一个字符串,但是一旦子进程完成了他们必须将对象序列化为字符串,将字符串发送到父进程,然后再将字符串反序列化为对象......唯一的区别是多处理不使用 JSON 作为其数据交换格式。
-
如果需要 35 秒,我高度怀疑这里还有其他一些我们忽略的瓶颈。
json.loads应该能够在微秒内处理这样的小数据。你是在一个批次中从 redis 中获取所有数据吗?或者您是按顺序从远程 redis 服务器请求条目? (只是推测,但这种延迟对于网络 i/o 来说更为典型)
标签: python json python-3.x dictionary ujson