【问题标题】:Speed-up Generator -> List -> CSV in PythonPython 中的加速生成器 -> 列表 -> CSV
【发布时间】:2023-04-07 02:16:02
【问题描述】:

我需要优化写入从 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。 10k 条记录大约需要 30 秒,这可能需要几个小时,因为在某些情况下,我必须处理数百万条记录(每条记录接近 70 列/特征)。

有没有更有效的方法?我尝试了不同的方法来迭代数据(例如在生成器上使用“For”和“next”),但没有明显更好的结果。

我应该以不同的方式从弹性搜索中提取数据吗? (除了返回生成器函数的扫描助手)

谢谢!

【问题讨论】:

    标签: python csv elasticsearch optimization generator


    【解决方案1】:
    [document['_source'] for document in results]
    

    实际上不是一个生成器,而是一个list comprehension,它根据需要分配尽可能多的内存以适应来自results 的所有文档。

    很可能更快的方法是实际使用generator

    (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))
    

    【讨论】:

    • 是的 - 但我提到的生成器是“结果” - 从弹性搜索的扫描助手返回。这就是我在“生成器 -> 列表 -> CSV”中的意思。 - 生成器:'results' - 列表:根据列表理解构建 - csv:文件上的 writerows
    • 我的回答仍然有效。可能的性能问题是在将其写入 CSV 文件之前创建了巨大的列表。
    • @WagnerMortz:我很好奇我建议的更改是否确实是问题所在。请告诉我们好吗?
    • 接受答案(答案左侧的绿色勾号)并点赞以表示感谢怎么样?
    • 完成了,因为我的声誉低于 15,所以只有赞成票不会显示
    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 2014-05-20
    • 2015-07-06
    • 2015-03-20
    • 2016-04-05
    • 2015-01-16
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多