Jak połączyć Pool.map z Array (pamięć współdzielona) w multiprocessingu Pythona?
Mam bardzo dużą (tylko do odczytu) tablicę danych, które chcę przetwarzać równolegle w wielu procesach.
Lubię funkcję Pool.map i chciałbym używać jej do obliczania funkcji na tych danych równolegle.
Widziałem, że można użyć klasy Value lub Array do użycia danych pamięci współdzielonej między procesami. Ale kiedy próbuję tego użyć, otrzymuję błąd RuntimeError: 'Obiekty synchroniczneString powinny być współużytkowane tylko między procesami poprzez dziedziczenie podczas korzystania z funkcji Pool.map:
Oto uproszczony przykład tego, co próbuję zrobić:
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"]] )
Czy ktoś może mi powiedzieć, co robię źle tutaj?
Tak więc chciałbym przekazać informacje o nowo utworzonej tablicy przydzielonej pamięci współdzielonej procesom po ich utworzeniu w puli procesów.