Misalkan saya memiliki array numpy memori yang besar, saya memiliki fungsi func
yang mengambil array raksasa ini sebagai input (bersama dengan beberapa parameter lain). func
dengan parameter yang berbeda dapat dijalankan secara paralel. Sebagai contoh:
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]
Jika saya menggunakan perpustakaan multiprosesing, maka array raksasa itu akan disalin beberapa kali ke dalam proses yang berbeda.
Apakah ada cara untuk membiarkan proses yang berbeda berbagi larik yang sama? Objek array ini hanya-baca dan tidak akan pernah diubah.
Apa yang lebih rumit, jika arr bukanlah sebuah array, tetapi sebuah objek python yang berubah-ubah, apakah ada cara untuk membagikannya?
[DIEDIT]
Saya membaca jawabannya tetapi saya masih agak bingung. Karena fork () adalah copy-on-write, kita tidak boleh meminta biaya tambahan saat melakukan proses baru di pustaka multiprosesing python. Tetapi kode berikut menunjukkan ada overhead yang sangat besar:
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;
output (dan omong-omong, biaya meningkat seiring dengan peningkatan ukuran array, jadi saya curiga masih ada overhead yang terkait dengan penyalinan memori):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
Mengapa ada overhead yang begitu besar, jika kita tidak menyalin array? Dan bagian apa dari memori bersama yang menyelamatkan saya?