ধরা যাক আমার কাছে মেমরি ন্যাম্পি অ্যারে বড় রয়েছে, আমার একটি ফাংশন রয়েছে func
যা এই জায়ান্ট অ্যারেটিকে ইনপুট হিসাবে গ্রহণ করে (কিছু অন্যান্য প্যারামিটারের সাথে একসাথে)। func
বিভিন্ন পরামিতি সমান্তরালে চালানো যেতে পারে। উদাহরণ স্বরূপ:
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]
যদি আমি মাল্টিপ্রসেসিং লাইব্রেরি ব্যবহার করি তবে সেই দৈত্য অ্যারেটি একাধিকবার বিভিন্ন প্রসেসে অনুলিপি করা হবে।
বিভিন্ন প্রক্রিয়াগুলিকে একই অ্যারে ভাগ করার কোনও উপায় আছে কি? এই অ্যারে অবজেক্টটি কেবল পঠনযোগ্য এবং কখনই পরিবর্তিত হবে না।
আর কী জটিল, যদি অ্যারেটি অ্যারে না হয় তবে একটি স্বেচ্ছাচারিত পাইথন বস্তু, এটিকে ভাগ করার কোনও উপায় আছে কি?
[সম্পাদনা]
আমি উত্তরটি পড়েছি তবে আমি এখনও কিছুটা বিভ্রান্ত। যেহেতু কাঁটাচামচ (অনুলিপি) অনুলিপি, তাই পাইথন মাল্টিপ্রসেসিং লাইব্রেরিতে নতুন প্রক্রিয়া তৈরি করার সময় আমাদের কোনও অতিরিক্ত ব্যয় করা উচিত নয়। তবে নীচের কোডটি দেখায় যে এখানে একটি বিশাল ওভারহেড রয়েছে:
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;
আউটপুট (এবং যাইহোক, অ্যারের আকার বাড়ার সাথে সাথে ব্যয় বৃদ্ধি পায়, তাই আমি সন্দেহ করি যে মেমরি অনুলিপি সম্পর্কিত এখনও ওভারহেড রয়েছে):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
এত বড় ওভারহেড কেন আছে, যদি আমরা অ্যারেটি অনুলিপি না করি? এবং ভাগ করা মেমরিটি কোন অংশটি আমাকে বাঁচায়?