6

大きな pandas データフレームがあります (サイズ = 3 GB):

x = read.table('big_table.txt', sep='\t', header=0, index_col=0)

メモリの制約の下で作業しているため、データフレームをサブセット化します。

rows = calculate_rows() # a function that calculates what rows I need
cols = calculate_cols() # a function that calculates what cols I need
x = x.iloc[rows, cols]

行と列を計算する関数は重要ではありませんが、元の行と列の小さなサブセットであることは間違いありません。ただし、この操作を行うと、メモリ使用量が大幅に増加します。当初の目標はメモリ フットプリントを 3GB 未満に縮小することでしたが、代わりにメモリ使用量が 6GB をはるかに超えています。

これは、Python がメモリ内にデータフレームのローカル コピーを作成するが、それをクリーンアップしないためだと推測しています。他のことも起こっている可能性があります...私の質問は、大きなデータフレームをサブセット化してスペースをクリーンアップするにはどうすればよいですか? 行/列をその場で選択する関数が見つかりません。

Stack Overflow をたくさん読みましたが、このトピックについてはあまり見つかりません。適切なキーワードを使用していない可能性があるため、提案があればそれも役に立ちます。ありがとう!

4

2 に答える 2

8

次のようなことを行う方がはるかに優れています。

usecols最初に必要な列をサブ選択するように指定します。ここread_csvを参照してください。

次に、ファイルをチャンクで読み取ります。ここを参照してください。必要な行が選択されている場合は、それらをオフにシャントし、最終的に結果を連結します。

疑似コードっぽい:

reader = pd.read_csv('big_table.txt', sep='\t', header=0, 
                     index_col=0, usecols=the_columns_i_want_to_use, 
                     chunksize=10000)

df = pd.concat([ chunk.iloc[rows_that_I_want_] for chunk in reader ])

これにより、一定のメモリ使用量 (チャンクのサイズ) になります。

加えて、選択された行の使用量 x 2。これは、連結後に行を連結したときに発生し、使用量は選択された行の使用量になります。

于 2013-10-30T17:50:45.070 に答える