Gần đây, tôi được hỏi về việc chia sẻ các mảng lớn có nhiều mảng khi sử dụng
X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
4 của Python. Mặc dù không được ghi lại rõ ràng, nhưng điều này thực sự có thể. Tôi sẽ viết về thủ thuật nhỏ này trong bài viết ngắn này. Hy vọng nó giúp. ] Cần lưu ý rằng tôi đang sử dụng Python 3. 6. Do đó, hướng dẫn này có thể không hoạt động trên các phiên bản Python cũ hơnX_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
4 cung cấp các cách dễ dàng để thực hiện song song các tác vụ ràng buộc CPU trong Python. Tuy nhiên, không giống như đa luồng, khi truyền đối số cho các tiến trình con, các dữ liệu này trong đối số phải được chọn. Trong hầu hết các trường hợp, điều này là tốt. Đối với một số tình huống, nó không phải là. Bây giờ giả sử rằng chúng ta có một ma trận dữ liệu lớn. Chúng tôi muốn mỗi quy trình con thực hiện các tác vụ độc lập dựa trên ma trận dữ liệu này và chúng chỉ cần quyền truy cập chỉ đọc vào ma trận dữ liệu. Nếu chúng ta gửi ma trận dữ liệu cho từng tiến trình con một cách bình thường, nó sẽ bị chọn mỗi khi chúng ta lên lịch cho một tác vụ mới và rất nhiều dung lượng bộ nhớ và băng thông sẽ bị lãng phí. Để giảm thiểu vấn đề này, chúng ta có thể chia sẻ ma trận dữ liệu giữa các tiến trình conGói
X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
6 cung cấp các đối tượng có thể chia sẻ sau. ________ 00, ________ 01, ________ 02, ________ 03. Các chi tiết có thể được tìm thấy. Về cơ bản, X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
0 và X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
1 không có khóa, trong khi X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
2 và X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
3 thì có. Bởi vì chúng tôi chỉ cần quyền truy cập chỉ đọc và chúng tôi muốn chia sẻ một ma trận, chúng tôi sẽ sử dụng X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
1. Đoạn mã sau sẽ tạo ra một X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
1 nhân đôiX_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
0X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
1 này là một mảng 1D hoặc một đoạn bộ nhớ sẽ được sử dụng để chứa ma trận dữ liệu. Để thao tác dữ liệu của nó dễ dàng hơn, chúng ta có thể bọc nó dưới dạng một mảng X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21 bằng cách sử dụng hàm X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
22. Đoạn mã sau cho biết cách một X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
1 được bọc dưới dạng một mảng X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21 và cách sử dụng X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
25 để điền vào X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
1 với dữ liệu hiện cóX_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
Ghi chú. bạn không cần sao chép tất cả dữ liệu vào
1 mới tạo cùng một lúc. Chẳng hạn, bạn có thể điền từng hàng bằng cách sử dụng thứ gì đó nhưX_shape = [16, 1000000] # Randomly generate some data data = np.random.randn[*X_shape] X = RawArray['d', X_shape[0] * X_shape[1]] # Wrap X as an numpy array so we can easily manipulates its data. X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape] # Copy data to our shared array. np.copyto[X_np, data]
28X_shape = [16, 1000000] # Randomly generate some data data = np.random.randn[*X_shape] X = RawArray['d', X_shape[0] * X_shape[1]] # Wrap X as an numpy array so we can easily manipulates its data. X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape] # Copy data to our shared array. np.copyto[X_np, data]
Quan trọng.
29 KHÔNG nên được chia sẻ với các tiến trình conX_shape = [16, 1000000] # Randomly generate some data data = np.random.randn[*X_shape] X = RawArray['d', X_shape[0] * X_shape[1]] # Wrap X as an numpy array so we can easily manipulates its data. X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape] # Copy data to our shared array. np.copyto[X_np, data]
Bây giờ chúng ta đã sẵn sàng chia sẻ ma trận dữ liệu với các tiến trình con. Về cơ bản, mỗi tiến trình con cần có quyền truy cập vào
X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
20 và X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21 [X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21 có thể được sao chép vào từng tiến trình mà không cần chia sẻ]. Python yêu cầu đối tượng dùng chung phải được chia sẻ theo thừa kế. Do đó, chúng tôi không thể vượt qua X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
20 làm đối số khi sử dụng X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
24 hoặc X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
25. Thay vào đó, khi tạo nhóm, chúng tôi chỉ định một X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
26 và X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
27 của nó. X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
27 sẽ chứa X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
20 và X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21 của chúng tôi. X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
26 sẽ được gọi khi tiến trình con được khởi tạo và chịu trách nhiệm lưu trữ X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
20 và X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21 dưới dạng biến toàn cục. Việc triển khai đơn giản nhất của X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
26 này giống như sauX_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
2Nhóm sau đó được khởi chạy thông qua
X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
2Bây giờ chúng ta có thể viết hàm worker. Như một ví dụ về đồ chơi, hàm worker của chúng ta sẽ chỉ chấp nhận một đối số, chỉ mục hàng i và tính tổng của hàng thứ i của
X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
20. Bởi vì cả X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
20 và X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21 đều được lưu trữ trong X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
28, hàm worker đơn giản như sauX_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
2Lưu ý rằng vì
X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
20 là một X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
1, chúng ta cần bọc nó lại bằng cách sử dụng thông tin hình dạng X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21 trước khi sử dụng các hàm X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21Với hàm worker đã sẵn sàng, chúng ta có thể sử dụng
X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
24 để gán nhiệm vụ tính tổng từng hàng cho các tiến trình con và thu thập kết quả. Đặt mọi thứ lại với nhau, chúng ta cóX_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
9Viết để chia sẻ mảng ⚠️
Cũng có thể ghi dữ liệu vào một mảng dùng chung từ tiến trình con. Tuy nhiên, chúng ta phải cẩn thận vì ghi không đồng bộ có thể dẫn đến kết quả không mong muốn
Nếu mỗi tiến trình con ghi vào các phần không chồng lấp của mảng, mọi thứ sẽ ổn. Nếu không, chúng ta sẽ cần tránh các điều kiện đua xe. Khi cần khóa, chúng ta có thể sử dụng
X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
3 thay vì X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
1. Ngoài ra, khi bọc một X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
3 bằng một khóa dưới dạng một mảng X_shape = [16, 1000000]
# Randomly generate some data
data = np.random.randn[*X_shape]
X = RawArray['d', X_shape[0] * X_shape[1]]
# Wrap X as an numpy array so we can easily manipulates its data.
X_np = np.frombuffer[X, dtype=np.float64].reshape[X_shape]
# Copy data to our shared array.
np.copyto[X_np, data]
21, chúng ta cần sử dụng cách sau để thay thế