私は大部分がバケットにデータを処理するために、DataFrameを処理する関数を持っていて、pd.get_dummies(df[col])
を使用して特定の列にフィーチャのバイナリ行列を作成します。 (メモリの外に出るとクラッシュするiPythonを引き起こす)一度この機能を使用して、私のすべてのデータの処理を回避するにはDataFramesの連結が指数関数的に遅くなるのはなぜですか?
、私が使用してチャンクに大きなデータフレームが壊れています
chunks = (len(df)/10000) + 1
df_list = np.array_split(df, chunks)
pd.get_dummies(df)
を自動的に作成します。 df[col]
の内容に基づく新しい列で、df
の場合はdf_list
でそれぞれ異なる可能性があります。
処理の後、私が使用して一緒に戻ってデータフレームを連結しています:
for i, df_chunk in enumerate(df_list):
print "chunk", i
[x, y] = preprocess_data(df_chunk)
super_x = pd.concat([super_x, x], axis=0)
super_y = pd.concat([super_y, y], axis=0)
print datetime.datetime.utcnow()
を最初のチャンクの処理時間は完全に受け入れている、しかし、それはチャンクごとに成長!これは、増加する理由がないので、preprocess_data(df_chunk)
とは関係ありません。 pd.concat()
への呼び出しの結果、この時間が増加していますか?
以下のログを参照してください。これをスピードアップするための回避策は
chunks 6
chunk 0
2016-04-08 00:22:17.728849
chunk 1
2016-04-08 00:22:42.387693
chunk 2
2016-04-08 00:23:43.124381
chunk 3
2016-04-08 00:25:30.249369
chunk 4
2016-04-08 00:28:11.922305
chunk 5
2016-04-08 00:32:00.357365
ありますか?私は2900チャンクを処理するので、どんな助けもありがとう!
Pythonの他の提案にもオープン!
こんにちは@unutbu、詳細な説明のおかげで、これは本当に詳細に理論を説明した! – jfive
このような形状の2900ブロックを連結することは可能でしょうか(43717,3261)?処理ステップは10秒しかかかりません。 – jfive