Büyük bir bellek dizilimine sahip olduğumu varsayalım func
, bu dev diziyi girdi olarak alan bir işleve sahibim (diğer bazı parametrelerle birlikte). func
farklı parametrelerle paralel olarak çalıştırılabilir. Örneğin:
def func(arr, param):
# do stuff to arr, param
# build array arr
pool = Pool(processes = 6)
results = [pool.apply_async(func, [arr, param]) for param in all_params]
output = [res.get() for res in results]
Çoklu işlem kitaplığı kullanırsam, o zaman bu dev dizi farklı işlemlere birden çok kez kopyalanacaktır.
Farklı işlemlerin aynı diziyi paylaşmasına izin vermenin bir yolu var mı? Bu dizi nesnesi salt okunurdur ve hiçbir zaman değiştirilmeyecektir.
Daha karmaşık olan şey, arr bir dizi değilse de keyfi bir python nesnesiyse, onu paylaşmanın bir yolu var mı?
[REDAKTE]
Cevabı okudum ama hala biraz kafam karışık. Fork (), yazma üzerine kopyalama olduğundan, python çoklu işlem kütüphanesinde yeni süreçler üretirken herhangi bir ek maliyet getirmemeliyiz. Ancak aşağıdaki kod, çok büyük bir ek yük olduğunu gösteriyor:
from multiprocessing import Pool, Manager
import numpy as np;
import time
def f(arr):
return len(arr)
t = time.time()
arr = np.arange(10000000)
print "construct array = ", time.time() - t;
pool = Pool(processes = 6)
t = time.time()
res = pool.apply_async(f, [arr,])
res.get()
print "multiprocessing overhead = ", time.time() - t;
çıktı (ve bu arada, dizinin boyutu arttıkça maliyet artar, bu nedenle bellek kopyalamayla ilgili hala ek yük olduğundan şüpheleniyorum):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
Diziyi kopyalamadıysak, neden bu kadar büyük ek yük var? Ve paylaşılan hafıza beni hangi bölümden kurtarıyor?