Birden çok işlem tarafından paralel olarak işlenmesini istediğim çok büyük (salt okunur) bir veri dizim var.Python çoklu işlemede Pool.map ile Array (shared memory) nasıl birleştirilir?
Pool.map işlevini seviyorum ve bu verilerdeki işlevlerin paralel olarak hesaplanmasını kullanmak istiyorum.
İşlemler arasında paylaşılan bellek verilerini kullanmak için Değer veya Dizi sınıfını kullanabileceğini gördüm. Bunu kullanmaya çalıştığınızda Ama RuntimeError olsun: 'Pool.map işlevini kullanırken SynchronizedString nesneleri sadece miras yoluyla işlemleri arasında paylaşılması gereken: Burada
Yapmak ne çalışıyorum basitleştirilmiş bir örnektir:from sys import stdin
from multiprocessing import Pool, Array
def count_it(arr, key):
count = 0
for c in arr:
if c == key:
count += 1
return count
if __name__ == '__main__':
testData = "abcabcs bsdfsdf gdfg dffdgdfg sdfsdfsd sdfdsfsdf"
# want to share it using shared memory
toShare = Array('c', testData)
# this works
print count_it(toShare, "a")
pool = Pool()
# RuntimeError here
print pool.map(count_it, [(toShare,key) for key in ["a", "b", "s", "d"]])
Burada yanlış yaptığım kişi bana söyleyebilir mi?
Ne yapmak isterim, işlem havuzunda oluşturulduktan sonra yeni oluşturulmuş bir paylaşılan bellek ayırma dizisi hakkında işlemlere bilgi aktarmaktır.
Maalesef bu mümkün değil. MP belgelerine göre önerilen yol, miras (çatallı platformlarda) kullanmaktır. Burada sadece okunan verileri okumak için normalde bir global kullanılacaktır, ancak okuma/yazma iletişimi için paylaşılan bir Dizi kullanabilir. Forking ucuzdur, böylece verileri aldığınız zaman Pool'u yeniden yaratabilirsiniz, daha sonra kapatın. Ne yazık ki, Windows'da bu mümkün değil - geçici bir paylaşılan bellek dizisi kullanmaktır (salt okunur durumda bile) ancak bu yalnızca süreç oluştururken alt işlemlere geçirilebilir (erişim listesine eklenmeleri gerektiğini hayal ediyorum) ... paylaşılan bellek segmenti için – robince
ve bu mantığın alt işlem başlangıcı dışında uygulanmadığı). Paylaşılan veri dizisini, gösterdiğim şekilde Havuz başlangıcında veya bir İşlemi benzer şekilde iletebilirsiniz. Paylaşılan bir bellek dizisini açık bir havuza aktaramazsınız - bellekten sonra havuz oluşturmak zorundasınız. Bunun etrafındaki kolay yollar, maksimum boyutta bir arabellek ayırmak veya yalnızca Havuz başlamadan önce gereken boyutu bildiğinizde diziyi ayırmaktır. Eğer global değişkenlerinizin altında kalıyorsanız, havuzlar Windows'ta çok pahalı olmamalı - global değişkenler otomatik olarak ... – robince
alınıp işlenen alt süreçlere gönderildi - bu yüzden başlangıçta yeterli büyüklükte bir arabellek hazırladım. Umarım küresel değişkenlerinizin miktarı küçüktür), daha sonra Pool, daha iyidir. Sorununuzu iyi niyetle anlamanız ve çözmeniz için zaman ayırdım - sorunuzu düzenlemeden önce - çalışmamıza izin vermek isteyip istemediğinizi anladığım halde, umarım sonunda farklı/daha iyi bir şey olmazsa cevabımı kabul etmeyi düşünebilirsiniz. boyunca. – robince