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関数に渡します。私はここでメモリエラーを取得し続ける。私はここから見ることができるように
、VIRTの複数倍に増加し、このエラーにつながります。
二つの質問、
- どのように私はVIRTでこのキー成長しているメモリの問題を解決するのですか?チャンクサイズで遊ぶ方法がありますか?
- 2番目のことは、プール(プロセス)で言及したように多くのpythonサブプロセスを起動しても、CPUが100%CPUを使用していないことがわかります。 1つまたは2つは一度に実行されますか?私は毎回通過する異なるデータ・フレーム・サイズに同じチャンク・サイズを適用している可能性があります(一部のデータ・フレームは小さくなります)。ここですべてのCPUプロセスをどのように利用しますか?
Pythonがすべてのデータをpickle&unpickleする必要があるときに、プロセス間でデータを渡すときに複雑なデータ構造を使用しないでください。両方のものをすべて再作成します。 'pandas'のようなBehemotesqueモジュールを使うと大量のリソースが必要です。また、イテレータ/ジェネレータを使用してデータを渡すので、開始する前にデータセット全体をメモリにマップする必要はありません([この回答](https://stackoverflow.com/a/44502827/7553525)の例) – zwer
ええ、マルチインデックスデータフレームですから、私は自分の関数でキー、カラムなどを確認する必要があります。また、データフレームのサイズはそれほど大きくはない、その処理は多くのメモリを必要とする。 –