2017-01-23 4 views
2

パンダのデータフレームがメモリから適切にクリアされない理由を理解しています。私のマシンが約16MBのメモリに達した後で、これが約400Mバイト残っているはずであることがわかった。私はDataFrameを作成し、それを同じ関数の中にコピーを作成します。この関数は何度も評価されます。機能が評価されるたびに、メモリが増加 - 以下のこの例では、337メガビット:パンダのデータフレームメモリの問題

この上のどのタッチさまざまなスレッドがありますが、まともな解決策がない
import pandas as pd 
import numpy as np 
from memory_profiler import profile 

@profile 
def loop_df(): 
    for _ in xrange(100): 
     copy_df() 

# Create a df and then copy it 
def copy_df(): 
    X = pd.DataFrame(np.random.rand(100000,10)) 
    X2 = X.loc[0:1000,:] 
    return 

loop_df() 

# Returns the following memory usage: 

#Line # Mem usage Increment Line Contents 
#================================================ 
# 13 100.3 MiB  0.0 MiB @profile 
# 14        def loop_df(): 
# 15 437.8 MiB 337.5 MiB  for _ in xrange(100): 
# 16 437.8 MiB  0.0 MiB   copy_df() 

Memory leak using pandas dataframehttps://github.com/pandas-dev/pandas/issues/6046https://github.com/pandas-dev/pandas/issues/2659は、Pandas: where's the memory leak here?

これを避けるためにできることについてのアドバイスは大歓迎です。これまでのところ、ガベージコレクタを使用して単純な例で作業しましたが、複雑なコードでは失敗します。マルチプロセッシングプールを使用することは、私の複雑なコードでもうまくいきました。しかし、マルチプロセッシングモデルの使用を必要としないソリューションがあれば良いでしょう。

Numpyの配列やリストなどのPythonオブジェクトがこのような動作をしないときに、なぜこれが起こっているのか説明できますか?これはバグやDataFrameオブジェクトの意図した動作ですか? gc.collect()続いdelを使用して

答えて

3

は、トリックを行うようだ:

import pandas as pd 
import numpy as np 
import gc 
from memory_profiler import profile 

@profile 
def loop_df(): 
    for _ in xrange(100): 
     copy_df() 

# Create a df and then copy it 
@profile 
def copy_df(): 
    X = pd.DataFrame(np.random.rand(100000,10)) 
    X2 = X.loc[0:1000,:] 
    del X, X2 
    gc.collect() 

loop_df() 

それでもメモリが不足している場合は、その後、ここに一つの可能​​な解決策は、numpyのmemmapを使用している(メモリがマッピングされた)データ構造:

import pandas as pd 
import numpy as np 
from memory_profiler import profile 
import gc 

@profile 
def loop_df(): 
    for _ in xrange(100): 
     copy_df() 
@profile 
def copy_df(): 
    mmap = np.memmap('mymemmap', dtype='float64', mode='w+', shape=(100000,10)) 
    mmap[:] = np.random.rand(100000,10) 
    df = pd.DataFrame(mmap) 
    df2 = df.loc[0:1000,:] 
    del df, df2, mmap 
    gc.collect() 
    pass 

if __name__ == '__main__': 
    loop_df() 

メモリ・マップ・ファイルは、ファイル全体をメモリに読み込むことなく、ディスク上の大きなファイルの小さなセグメントにアクセスするために使用されています。

申し訳ありません申し訳ありませんが、あなたのサンプルコードでパンダのデータが既に解放されていない理由を説明できません。私はそれがネイティブ配列や何かを使用してnumpyやpandasと関係があると考えています。

関連する問題