मेरे पास 256x256x256
नकली सरणी है, जिसमें प्रत्येक तत्व एक मैट्रिक्स है। मुझे इनमें से प्रत्येक मैट्रिक्स पर कुछ गणना करने की ज़रूरत है, और मैं चीजों को गति देने के लिए multiprocessing
मॉड्यूल का उपयोग करना चाहता हूं।itertools और multiprocessing संयोजन?
इन गणनाओं के परिणाम, एक 256x256x256
सरणी मूल एक की तरह में संग्रहित किया जाना चाहिए ताकि मूल सरणी में तत्व [i,j,k]
में मैट्रिक्स का नतीजा नई सरणी के [i,j,k]
तत्व में डाल दिया जाना चाहिए।
ऐसा करने के लिए, मैं एक सूची बनाना चाहता हूं जो छद्म-आश मार्ग में [array[i,j,k], (i, j, k)]
के रूप में लिखा जा सकता है और इसे "मल्टीप्रोसेस्ड" होने के लिए एक समारोह में पास कर सकता है। यह मानते हुए कि matrices
सभी मैट्रिक्स मूल सरणी और myfunc
से निकाले की एक सूची है समारोह गणना कर रही है, कोड इस तरह कुछ हद तक दिखेगा:
import multiprocessing
import numpy as np
from itertools import izip
def myfunc(finput):
# Do some calculations...
...
# ... and return the result and the index:
return (result, finput[1])
# Make indices:
inds = np.rollaxis(np.indices((256, 256, 256)), 0, 4).reshape(-1, 3)
# Make function input from the matrices and the indices:
finput = izip(matrices, inds)
pool = multiprocessing.Pool()
async_results = np.asarray(pool.map_async(myfunc, finput).get(999999))
हालांकि, यह की तरह map_async
वास्तव में इस पैदा कर रही है लगता है विशाल finput
- पहले सूची: मेरा सीपीयू बहुत कुछ नहीं कर रहा है, लेकिन स्मृति और स्वैप सेकंड के मामले में पूरी तरह से उपभोग हो जाता है, जो स्पष्ट रूप से मैं नहीं चाहता हूं।
क्या इस विशाल सूची को मल्टीप्रोसेसिंग फ़ंक्शन में पास करने का कोई तरीका है बिना इसे स्पष्ट रूप से बनाने की आवश्यकता के? या आप इस समस्या को हल करने का एक और तरीका जानते हैं?
धन्यवाद एक गुच्छा! :-)
चूंकि आप 'map_async()' पर 'get() 'का उपयोग कर रहे हैं, तो आप शायद * एसिंक्रोनस * ऑपरेशन नहीं चाहते हैं और इसके बजाय' Pool.map() 'का उपयोग करना चाहिए। –
शायद मैं समस्या को सही ढंग से समझ नहीं पा रहा हूं, लेकिन क्या आपने imap या imap_unordered माना है? –