加速生成器 -> 列表 -> Python 中的 CSV
Speed-up Generator -> List -> CSV in Python
我需要优化写入从 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])
我计时并发现罪魁祸首是:
"[结果中文档的文档['_source']]"
需要很长很长的时间,通过生成器将它解压成一个列表,这样才能写入CSV。 10k 条记录大约需要 30 秒,这可能总共需要几个小时,因为在某些情况下我必须处理数百万条记录(每条记录接近 70 columns/features)。
有没有更有效的方法?我尝试了不同的方法来迭代数据(比如在生成器上使用“For”和“next”),但没有明显更好的结果。
我应该以不同的方式从弹性搜索中提取数据吗? (扫描助手除外,returns 生成器函数)
谢谢!
[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))
我需要优化写入从 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])
我计时并发现罪魁祸首是: "[结果中文档的文档['_source']]"
需要很长很长的时间,通过生成器将它解压成一个列表,这样才能写入CSV。 10k 条记录大约需要 30 秒,这可能总共需要几个小时,因为在某些情况下我必须处理数百万条记录(每条记录接近 70 columns/features)。
有没有更有效的方法?我尝试了不同的方法来迭代数据(比如在生成器上使用“For”和“next”),但没有明显更好的结果。
我应该以不同的方式从弹性搜索中提取数据吗? (扫描助手除外,returns 生成器函数)
谢谢!
[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))