2013-04-22 38 views
5

Tôi phải tạo và điền vào các mảng lớn (ví dụ: 96 Tới, 72000 hàng * 72000 cột) với phao nổi trong mỗi trường hợp đến từ các công thức toán học. Mảng sẽ được tính sau.Cách nhanh nhất để tạo và lấp đầy mảng 2D có khối lượng lớn?

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 
  • cách nhanh nhất để tạo ra và điền vào mảng NumPy lớn như vậy là gì? Điền danh sách sau đó tổng hợp sau đó chuyển thành mảng numpy?
  • Chúng ta có thể song song tính toán khi biết rằng các trường hợp/cột/hàng của mảng 2d độc lập với việc tăng tốc độ lấp đầy mảng không? Các đầu mối/con đường để tối ưu hóa tính toán như vậy bằng cách sử dụng Multiprocessing?
+0

Liệu nó cần phải được theo thời gian thực hoặc bạn có thể tính toán nó off-line và sử dụng ví dụ dưa để đọc nó? –

+0

Tôi thích là thời gian thực nhưng nếu tẩy là nhanh hơn, tôi không nhớ ... hy vọng rằng tôi hiểu rõ câu hỏi của bạn? – sol

Trả lời

0

Bạn có thể tạo mảng trống numpy.memmap với hình dạng mong muốn và sau đó sử dụng multiprocessing.Pool để điền giá trị của nó. Làm điều đó một cách chính xác cũng sẽ giữ chân bộ nhớ của mỗi quá trình trong hồ bơi của bạn tương đối nhỏ.

+0

Xem http://stackoverflow.com/questions/9964809/numpy-vs-multiprocessing-and-mmap, vì vậy tôi không nghĩ rằng điều này làm việc –

+0

@sega_sai thú vị. Tôi sẽ không xóa câu trả lời của tôi, bởi vì tôi tin rằng những người khác có thể học (như tôi đã làm) nhìn thấy nó cùng với bình luận của bạn quyết định nó ra. cảm ơn. – shx2

1

Tôi biết rằng bạn có thể tạo mảng được chia sẻ chung có thể được thay đổi từ các chuỗi khác nhau (giả sử rằng các khu vực đã thay đổi không trùng lặp). Dưới đây là tóm tắt các mã mà bạn có thể sử dụng để làm điều đó (tôi thấy ý tưởng ban đầu ở đâu đó trên stackoverflow, chỉnh sửa: ở đây nó là 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

có hoạt động không? Tôi không hiểu sự quan tâm/lừa của lớp singleton. Tôi có TypeError: đối tượng 'NoneType' không hỗ trợ gán mục. Tôi đã thử sửa đổi không có kết quả. Bạn có thể giúp tôi thêm một chút được không? – sol

+0

Mã của tôi hoạt động trên linux (đã xác minh). Nếu bạn có cửa sổ, tôi sợ bạn đã làm mọi thứ khác đi. (bởi vì giá trị singleton.arr sẽ không được thừa hưởng bởi các quá trình từ nhóm). –

Các vấn đề liên quan