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).
Đố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. –
@JoeKington - Bạn nói đúng. Vấn đề là với mảng numpy nói chung. –