我需要优化一个从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)
谢谢!
1条答案
按热度按时间vs3odd8k1#
它实际上不是一个生成器,而是一个列表理解,可以根据需要分配足够的内存来容纳来自
results
.很可能更快的方法是实际使用生成器:
总共: