閲覧ありがとうございます。
dataframe型に格納されているデータをElasticSearchにbulk insertしようと考えております。
一旦、dataframeの中をiterrowsでループしながら、ElasticSearchのbulk insert用に成形してESに登録したのですが、50万件登録するのに5分くらいかかってしまうので、速度を改善したいです。
iterrowsはもともと遅いってことが文献にのっていたのですが、代替案(mapを使う、不要なインスタンスを作らないコーディング等)を調べたのですが、知識不足で実装することが困難です。
下記にソースを記載しますので、改善策をアドバイスいただけると助かります。
python3
1def es_doc_generator(df): 2 """ 3 ES登録ドキュメント生成 4 """ 5 # パフォーマンスチューニング中 6 doc = [] 7 for d in df.iterrows(): 8 doc = [{key: d[1][key] for key in d[1].keys()}] 9 10 # イメージ:log-20200725 11 tdatetime = datetime.datetime.strptime(doc[0]['eventTimestamp'], '%Y-%m-%d %H:%M:%S') 12 index = "log-" + str(tdatetime.year) + str(tdatetime.month) + str(tdatetime.day) 13 yield { 14 "_index": index, 15 "_id": doc[0]['SeqNo'], 16 "_type": "_doc", 17 "_source": doc[0], 18 } 19 20def es_insert(df): 21 #- Elasticsearch定義ファイル読み込み 22 __es_dict = read_es_conf(ES) 23 24 #- Elasticsearch接続 25 __esCon = es_connect(__es_dict) 26 27 # ESデータをbulk投入 28 helpers.bulk(__esCon,es_doc_generator(df)) 29 30if __name__ == "__main__": 31 # df 32 33 df = pd.DataFrame({'A': ['A1', 'A2', '2020/05/21 12:00:00','001'], 34 'B': ['B1', 'B2', '2020/05/22 12:00:00','002'], 35 'C': ['C1', 'C2', '2020/05/22 13:00:00','003']}, 36 index=['ONE', 'TWO', 'eventTimestamp','Seq']) 37 es_insert(df) 38
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/21 22:19