2017-08-20 84 views
0

我用14個內核調用pool.apply_async()。pool.apply_async需要很長時間才能完成,如何加快速度?

import multiprocessing 
    from time import time 
    import timeit 

    informative_patients = informative_patients_2500_end[20:] 
    pool = multiprocessing.Pool(14) 
    results = [] 
    wLength = [20,30,50] 

    start = time() 

    for fn in informative_patients: 
     result = pool.apply_async(compute_features_test_set, args = (fn, 
     wLength), callback=results.append) 

    pool.close() 

    pool.join() 


    stop = timeit.default_timer() 

    print stop - start 

的問題是它完成調用用於第一13個數據compute_features_test_set()函數在不到一小時,但它需要一個多小時以完成最後一個。所有14個數據集的數據大小都是相同的。我試着在pool.close()之後放置pool.terminate(),但在這種情況下,它甚至不會啓動池並立即終止池,而無需進入for循環。這總是以同樣的方式發生,如果我使用更多的內核和更多的數據集,總是最後一個需要很長時間才能完成。我的compute_features_test_set()函數是一個簡單的特徵提取代碼,並且可以正常工作。我在Linux red hat 6,python 2.7和jupyter上工作。計算時間對我來說很重要,我的問題是這裏出了什麼問題,以及我如何修復它以在合理的時間內完成所有計算?

+0

你有多少**真正的核心**? 'informative_parients'的大小有多大? – stovfl

+0

我想我在我工作的服務器上有32個真正的核心。 informative_parients只有14個患者ID,我在任何患者ID的for循環中稱我的特徵提取功能。因此,informative_parients是一個由14個字符串組成的數組,每個字符串的長度爲8.我使用患者ID爲每個患者收集信息,作爲我的特徵提取功能的輸入。 – nightrain

回答

0

問題:......這裏有什麼問題,我該如何解決

無法趕上這是一個multiprocessing問題。
但是如何你得到這個:「總是最後一個需要這麼長時間才能完成」
您正在使用callback=results.append而不是自己的function
編輯您的問題並顯示如何timeit一個處理時間。
還可以將您的Python版本添加到您的問題。

執行以下操作來驗證它不是一個數據問題

start = time() 
    results.append(
     compute_features_test_set(<First informative_patients>, wLength 
     ) 
    stop = timeit.default_timer() 
    print stop - start 

    start = time() 
    results.append(
     compute_features_test_set(<Last informative_patients>, wLength 
     ) 
    stop = timeit.default_timer() 
    print stop - start 

比較你得到的兩倍。

相關問題