2013-04-22 14 views
5

数式から来るそれぞれのケースで、巨大な(、例えば 96Go、72000行×72000列)の配列を作成して浮動小数点数を入れなければなりません。配列は後に計算されます。巨大なnumpy 2D配列を作成して塗りつぶす最速の方法は?

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配列に変換しますか?
  • 2d-arrayのcase/columns/rowsが独立しているため、配列の充填を高速化できますか?マルチプロセッシングを使ってそのような計算を最適化するための手掛かり/トレイル?
+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配列を作成できることを知っています。ここではあなたがそれを行うために使用できるコードのスケッチである(私は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

私のコードはlinux(検証済み)で動作します。あなたが窓を持っているなら、私はあなたが物事を別々にすることを恐れています。 (singleton.arrの値はプールからのプロセスによって継承されないためです)。 –

関連する問題