0

につながり、Pythonのマルチプロセッシング・サブプロセス - 高VIRTの使用量は、私は私のカスタム関数を実行するためにマルチプロセッシングにpool.mapを使用していますメモリエラー

def my_func(data): #This is just a dummy function. 
    data = data.assign(new_col = data.apply(lambda x: f(x), axis = 1)) 
    return data 

def main(): 
    mypool=pool.Pool(processes=16,maxtasksperchild=100) 
    ret_list=mypool.map(my_func,(group for name, group in gpd)) 
    mypool.close() 
    mypool.join() 
    result = pd.concat(ret_list, axis=0) 

はここGPDは、グループ化されたデータフレームであるので、私は1つのデータフレームを渡しています一度にpool.map関数に渡します。私はここでメモリエラーを取得し続ける。私はここから見ることができるように

enter image description here

、VIRTの複数倍に増加し、このエラーにつながります。

二つの質問、

  1. どのように私はVIRTでこのキー成長しているメモリの問題を解決するのですか?チャンクサイズで遊ぶ方法がありますか?
  2. 2番目のことは、プール(プロセス)で言及したように多くのpythonサブプロセスを起動しても、CPUが100%CPUを使用していないことがわかります。 1つまたは2つは一度に実行されますか?私は毎回通過する異なるデータ・フレーム・サイズに同じチャンク・サイズを適用している可能性があります(一部のデータ・フレームは小さくなります)。ここですべてのCPUプロセスをどのように利用しますか?
+0

Pythonがすべてのデータをpickle&unpickleする必要があるときに、プロセス間でデータを渡すときに複雑なデータ構造を使用しないでください。両方のものをすべて再作成します。 'pandas'のようなBehemotesqueモジュールを使うと大量のリソースが必要です。また、イテレータ/ジェネレータを使用してデータを渡すので、開始する前にデータセット全体をメモリにマップする必要はありません([この回答](https://stackoverflow.com/a/44502827/7553525)の例) – zwer

+0

ええ、マルチインデックスデータフレームですから、私は自分の関数でキー、カラムなどを確認する必要があります。また、データフレームのサイズはそれほど大きくはない、その処理は多くのメモリを必要とする。 –

答えて

0

将来的に回答を探している人向けです。マップの代わりにimapを使って解決しました。 mapは集中的なイテレータのリストを作成するためです。

関連する問題