2011-12-15 40 views
5

Tôi có một mảng numpy mà tôi muốn chia sẻ giữa một loạt các quy trình python theo cách không liên quan đến bản sao. Tôi tạo ra một mảng numpy chia sẻ từ một mảng numpy hiện có bằng cách sử dụng gói sharedmem.Chia sẻ không tiếp giáp Numpy Array

import sharedmem as shm 
def convert_to_shared_array(A): 
    shared_array = shm.shared_empty(A.shape, A.dtype, order="C") 
    shared_array[...] = A 
    return shared_array 

Vấn đề của tôi là mỗi quy trình con cần truy cập vào các hàng được phân phối ngẫu nhiên trong mảng. Hiện tại tôi tạo ra một mảng numpy chia sẻ bằng cách sử dụng gói sharedmem và chuyển nó cho mỗi tiến trình con. Mỗi quá trình cũng có một danh sách, idx, của các hàng mà nó cần truy cập. Sự cố xảy ra trong quy trình con khi tôi thực hiện:

#idx = list of randomly distributed integers 

local_array = shared_array[idx,:] 

# Do stuff with local array 

Tạo bản sao mảng thay vì chỉ một chế độ xem khác. Mảng khá lớn và thao tác nó trước khi chia sẻ nó để mỗi quá trình truy cập một dải các hàng liền nhau như

local_array = shared_array[start:stop,:] 

mất quá nhiều thời gian.

Câu hỏi: Giải pháp tốt để chia sẻ quyền truy cập ngẫu nhiên vào mảng có nhiều mảng giữa các quy trình python không liên quan đến sao chép mảng là gì?

Các quy trình con cần quyền truy cập chỉ đọc (vì vậy không cần khóa khi truy cập).

+1

Đối với bất cứ điều gì đáng giá, điều này không liên quan gì đến việc bộ nhớ được chia sẻ. Numpy mảng phải được tiếp giáp trong bộ nhớ, vì vậy bất kỳ chỉ mục ưa thích (ví dụ như lập chỉ mục với một mảng các chỉ dẫn) luôn luôn trả về một bản sao. Điều này là đúng đối với bất kỳ mảng numpy nào. Hoặc là làm việc với các phần nhỏ hơn của các chỉ báo hoặc lặp lại, thay vì cắt. –

+0

@JoeKington - Bạn nói đúng. Vấn đề là với mảng numpy nói chung. –

Trả lời

1

Lập chỉ mục ưa thích tạo ra một bản sao, vì vậy bạn cần tránh lập chỉ mục ưa thích nếu bạn muốn tránh các bản sao không có cách nào xung quanh nó.

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