为了账号安全,请及时绑定邮箱和手机立即绑定

Python 中的加速生成器 -> 列表 -> CSV

Python 中的加速生成器 -> 列表 -> CSV

GCT1015 2023-09-12 17:54:10
我需要优化写入从 Elastic Search 中提取的 CSV 文件数据的过程,其中 elasticsearch.helpers.scan 使用 json/dict 数据构建一个生成器函数。results = elasticsearch.helpers.scan(es, query=body, index=index)with io.open(csv_file_name, "w", encoding="utf-8", newline="") as csv_file:    writer = csv.DictWriter(csv_file, fieldnames=column_names, delimiter=';')    writer.writeheader()    writer.writerows([document['_source'] for document in results])我计时了一下,发现罪魁祸首是: “[document['_source'] for document in results]”需要很长很长的时间来通过生成器将其解包到列表中,以便将其写入 CSV。大约需要 30 秒处理 10k 条记录,这可能总共需要几个小时,因为在某些情况下我必须处理数百万条记录(每条记录接近 70 列/功能)。有没有更有效的方法来做到这一点?我尝试了不同的方法来迭代数据(例如在生成器上使用“For”和“next”),但没有明显更好的结果。我应该以不同的方式从弹性搜索中提取数据吗?(扫描助手除外,它返回生成器函数)
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

[document['_source'] for document in results]

实际上不是一个生成器,而是一个列表理解,它根据需要分配尽可能多的内存来容纳 中的所有文档results

很可能更快的方法是实际使用生成器:

(document['_source'] for document in results)

共:

results = elasticsearch.helpers.scan(es, query=body, index=index)
with io.open(csv_file_name, "w", encoding="utf-8", newline="") as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=column_names, delimiter=';')
    writer.writeheader()
    writer.writerows((document['_source'] for document in results))


查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 51 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信