Giv*_*ivP 4 python csv elasticsearch
我有一个简单的python脚本,用于索引包含100万行的CSV文件:
import csv
from pyes import *
reader = csv.reader(open('data.csv', 'rb'))
conn = ES('127.0.0.1:9200', timeout=20.0)
counter = 0
for row in reader:
try:
data = {"name":row[5]}
conn.index(data,'namesdb',counter, bulk=True)
counter += 1
except:
pass
Run Code Online (Sandbox Code Playgroud)
这很有效但是当我们进入成千上万时,它们都会成倍地减速.
我猜测如果我在较小的块中做了索引,ES会表现得更好.
有更有效的方法吗?sleep()延迟会有帮助吗?或者是否有一种简单的方法可以通过编程方式将csv分解为更小的块?
谢谢.
您可以在创建ES实例时调整批量大小.像这样的东西:
conn = ES('127.0.0.1:9200', timeout=20.0, bulk_size=100)
Run Code Online (Sandbox Code Playgroud)
默认批量大小为400.也就是说,当您批量处理400个文档时,pyes会自动发送批量内容.如果你想在我们到达的bulk_size之前发送批量(例如:在退出之前),你可以调用conn.flush_bulk(forced = True)
我不确定在每个第N个文档手动刷新索引是否是最好的选择.默认情况下,Elasticsearch会自动执行此操作.你能做的就是增加那个时间.像这样的东西:
curl -XPUT localhost:9200/namesdb/_settings -d '{
"index" : {
"refresh_interval" : "3s"
}
}'
Run Code Online (Sandbox Code Playgroud)
或者,您可以像Dragan建议的那样手动刷新,但在这种情况下,通过将间隔设置为"-1"来禁用Elasticsearch的自动刷新可能是有意义的.但是您不需要刷新每个X文档,您可以在完成所有文档的插入后刷新.
更多细节:http: //www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html
请注意,刷新是相当昂贵的,根据我的经验,你最好还是: - 让Elastisearch在后台进行刷新 - 完全禁用刷新并在我完成插入整组之后重新启用它文件
| 归档时间: |
|
| 查看次数: |
6759 次 |
| 最近记录: |