5

मुझे गणितीय सूत्रों से आने वाले प्रत्येक मामले में फ्लोट के साथ विशाल (उदा। 96 गो, 72000 पंक्तियां * 72000 कॉलम) सरणी बनाना और भरना है। सरणी के बाद गणना की जाएगी।विशाल numpy 2 डी-सरणी बनाने और भरने का सबसे तेज़ तरीका?

import itertools, operator, time, copy, os, sys 
import numpy 
from multiprocessing import Pool 


def f2(x): # more complex mathematical formulas that change according to values in *i* and *x* 
    temp=[] 
    for i in combine: 
     temp.append(0.2*x[1]*i[1]/64.23) 
    return temp 

def combinations_with_replacement_counts(n, r): #provide all combinations of r balls in n boxes 
    size = n + r - 1 
    for indices in itertools.combinations(range(size), n-1): 
     starts = [0] + [index+1 for index in indices] 
     stops = indices + (size,) 
     yield tuple(map(operator.sub, stops, starts)) 

global combine 
combine = list(combinations_with_replacement_counts(3, 60)) #here putted 60 but need 350 instead 
print len(combine) 
if __name__ == '__main__': 
    t1=time.time() 
    pool = Pool()    # start worker processes 
    results = [pool.apply_async(f2, (x,)) for x in combine] 
    roots = [r.get() for r in results] 
    print roots [0:3] 
    pool.close() 
    pool.join() 
    print time.time()-t1 
  • बना सकते हैं और इस तरह के विशाल numpy सरणी को भरने के लिए सबसे तेज़ तरीका क्या है? भरने के बाद कुल मिलाकर numpy array में परिवर्तित करें?
  • क्या हम गणना कर सकते हैं कि 2 डी-सरणी के मामलों/कॉलम/पंक्तियां सरणी भरने के लिए स्वतंत्र हैं? मल्टीप्रोसेसिंग का उपयोग करके इस तरह के गणना को अनुकूलित करने के लिए सुराग/ट्रेल्स?
+0

यह वास्तविक समय होने की जरूरत है या आप इसे गणना कर सकते हैं ऑफ़लाइन और उदाहरण का उपयोग करें इसे पढ़ने के लिए अचार? –

+0

मैं रीयल-टाइम बनना पसंद करता हूं लेकिन अगर पिकलिंग तेज है, तो मुझे कोई फर्क नहीं पड़ता ... उम्मीद है कि मैं आपका प्रश्न अच्छी तरह से समझ गया हूं? – sol

उत्तर

0

आप इच्छित आकार के साथ एक खाली numpy.memmap सरणी बना सकते हैं, और फिर multiprocessing.Pool का उपयोग अपने मान भरने के लिए। इसे सही तरीके से करने से आपके पूल में अपेक्षाकृत कम प्रत्येक प्रक्रिया की स्मृति पदचिह्न भी जारी रहेगी।

+0

http://stackoverflow.com/questions/9964809/numpy-vs-multiprocessing-and-mmap देखें, इसलिए मुझे नहीं लगता कि यह –

+0

@sega_sai दिलचस्प काम करता है। मैं अपना जवाब हटाने वाला नहीं हूं, क्योंकि मेरा मानना ​​है कि दूसरों को यह सीखने से (जैसे मैंने किया) आपकी टिप्पणी के साथ इसे देखने से देख सकते हैं। धन्यवाद। – shx2

1

मुझे पता है कि आप साझा किए गए numpy arrays बना सकते हैं जिन्हें विभिन्न धागे से बदला जा सकता है (माना जाता है कि बदले गए क्षेत्र ओवरलैप नहीं होते हैं)। यहाँ कोड है कि आप ऐसा करने के लिए उपयोग कर सकते हैं के स्केच है (मैं stackoverflow पर कहीं मूल विचार को देखा, संपादित करें: यहाँ यह है https://stackoverflow.com/a/5550156/1269140)

import multiprocessing as mp ,numpy as np, ctypes 

def shared_zeros(n1, n2): 
    # create a 2D numpy array which can be then changed in different threads 
    shared_array_base = mp.Array(ctypes.c_double, n1 * n2) 
    shared_array = np.ctypeslib.as_array(shared_array_base.get_obj()) 
    shared_array = shared_array.reshape(n1, n2) 
    return shared_array 

class singleton: 
    arr = None 

def dosomething(i): 
    # do something with singleton.arr 
    singleton.arr[i,:] = i 
    return i 

def main(): 
    singleton.arr=shared_zeros(1000,1000) 
    pool = mp.Pool(16) 
    pool.map(dosomething, range(1000)) 

if __name__=='__main__': 
    main() 
+0

यह काम करता है? मैं सिंगलटन वर्ग की रुचि/चाल को समझ नहीं पा रहा हूं। मेरे पास TypeError है: 'noneType' ऑब्जेक्ट आइटम असाइनमेंट का समर्थन नहीं करता है। मैंने बिना किसी परिणाम के संशोधन की कोशिश की। क्या आप कृपया थोड़ा और मदद कर सकते हैं? – sol

+0

मेरा कोड लिनक्स (सत्यापित) पर काम करता है। यदि आपके पास खिड़कियां हैं, तो मुझे डर है कि आपने चीजों को अलग-अलग किया है। (क्योंकि सिंगलटन.एआर मान पूल से प्रक्रियाओं द्वारा विरासत में नहीं मिलेगा)। –

संबंधित मुद्दे