0
我使用pool.map在多盡我的自定義函數,蟒蛇多子 - 高VIRT使用會導致內存不足的錯誤
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是一個分組的數據幀,因此我傳遞一個數據幀一次到這裏的pool.map函數。我不斷收到內存錯誤。
,我可以從這裏看到,VIRT增加多個倍,導致這個錯誤。
兩個問題,
- 我如何解決這個問題的關鍵在VIRT成長記憶問題?可能是在這裏玩塊大小的一種方式。?
- 第二件事,雖然它的推出儘可能多的蟒子,因爲我在游泳池(進程)中提到,我可以看到所有的CPU不打100%的CPU,好像它不使用的所有過程。一次或兩次運行?可能是由於它在每次傳遞的不同數據幀大小上應用相同的塊大小(有些數據幀會很小)?我該如何利用每個CPU進程?
進程之間傳遞數據時,像Python需要鹹菜和unpickle所有的數據,不使用複雜的數據結構重新創造一切。另外,不要使用迭代器/發電機傳遞數據的時候,所以你不必整個數據集映射在內存中,你甚至開始之前(見[這個答案](https://stackoverflow.com/a/44502827/7553525)爲一個例子) – zwer
是的,但它是一個多索引數據框架,我需要確保我的函數中的鍵,列等等。而且,數據幀大小並不那麼大,其處理佔用大量內存。 –