>列表->csv

jchrr9hc  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(202)

我需要优化一个从elasticsearch中提取的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['\u source']for document in results]”
通过生成器将其解压到列表中需要很长很长时间,这样才能将其写入csv。比如10万条记录需要30秒,这可能需要几个小时,因为在某些情况下,我必须处理数以百万计的记录(每个记录需要接近70列/特征)。
有没有更有效的方法?我尝试了不同的方法对数据进行迭代(比如在生成器上使用“for”和“next”),但没有明显更好的结果。
我是否应该以另一种方式从ElasticSearch中提取数据(而不是返回生成器函数的scan helper)
谢谢!

vs3odd8k

vs3odd8k1#

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

相关问题