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函數。我不斷收到內存錯誤。

enter image description here

,我可以從這裏看到,VIRT增加多個倍,導致這個錯誤。

兩個問題,

  1. 我如何解決這個問題的關鍵在VIRT成長記憶問題?可能是在這裏玩塊大小的一種方式。?
  2. 第二件事,雖然它的推出儘可能多的蟒子,因爲我在游泳池(進程)中提到,我可以看到所有的CPU不打100%的CPU,好像它不使用的所有過程。一次或兩次運行?可能是由於它在每次傳遞的不同數據幀大小上應用相同的塊大小(有些數據幀會很小)?我該如何利用每個CPU進程?
+0

進程之間傳遞數據時,像Python需要鹹菜和unpickle所有的數據,不使用複雜的數據結構重新創造一切。另外,不要使用迭代器/發電機傳遞數據的時候,所以你不必整個數據集映射在內存中,你甚至開始之前(見[這個答案](https://stackoverflow.com/a/44502827/7553525)爲一個例子) – zwer

+0

是的,但它是一個多索引數據框架,我需要確保我的函數中的鍵,列等等。而且,數據幀大小並不那麼大,其處理佔用大量內存。 –

回答

0

只是爲了有人找未來的答案。我通過使用imap而不是map來解決這個問題。因爲map會製作一個密集的迭代器列表。在其兩側,當像`pandas`使用behemotesque模塊可以利用的資源的顯著量

相關問題