我用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上工作。計算時間對我來說很重要,我的問題是這裏出了什麼問題,以及我如何修復它以在合理的時間內完成所有計算?
你有多少**真正的核心**? 'informative_parients'的大小有多大? – stovfl
我想我在我工作的服務器上有32個真正的核心。 informative_parients只有14個患者ID,我在任何患者ID的for循環中稱我的特徵提取功能。因此,informative_parients是一個由14個字符串組成的數組,每個字符串的長度爲8.我使用患者ID爲每個患者收集信息,作爲我的特徵提取功能的輸入。 – nightrain