我正在嘗試利用Python3
中的concurrent.futures.ProcessPoolExecutor
來並行處理大矩陣。代碼的一般結構是:爲什麼concurrent.futures.ProcessPoolExecutor的性能很低?
class X(object):
self.matrix
def f(self, i, row_i):
<cpu-bound process>
def fetch_multiple(self, ids):
with ProcessPoolExecutor() as executor:
futures = [executor.submit(self.f, i, self.matrix.getrow(i)) for i in ids]
return [f.result() for f in as_completed(futures)]
self.matrix
是一個大scipy csr_matrix。 f
是我的concurrrent函數,它需要一行self.matrix
並對其應用CPU上的進程。最後,fetch_multiple
是並行運行多個實例f
並返回結果的函數。
的問題是,在運行腳本之後,所有的CPU核心均小於50%,忙(見下截圖):
爲什麼所有的內核是不是很忙?
我認爲問題是self.matrix
的大對象,並在進程之間傳遞行向量。我怎麼解決這個問題?