Tôi đang sử dụng mô-đun multiprocessing
của Python để xử lý song song mảng lớn song song. Các mảng được ánh xạ bộ nhớ bằng cách sử dụng numpy.load(mmap_mode='r')
trong quy trình tổng thể. Sau đó, multiprocessing.Pool()
dồn quá trình (tôi đoán).NumPy so với đa xử lý và mmap
Tất cả mọi thứ dường như làm việc tốt, ngoại trừ tôi nhận được những câu nói như:
AttributeError ("đối tượng 'NoneType' không có thuộc tính 'nói'",) trong
<bound method memmap.__del__ of memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>
lờ
trong nhật ký không lưu trữ. Tuy nhiên, các bài kiểm tra đã trôi qua.
Bất kỳ ý tưởng gì đang xảy ra ở đó?
Sử dụng Python 2.7.2, OS X, NumPy 1.6.1.
UPDATE:
Sau khi một số lỗi, tôi săn lùng nguyên nhân để một con đường mã mà đã sử dụng một (slice nhỏ) mảng NumPy này bộ nhớ ánh xạ như đầu vào cho một cuộc gọi Pool.imap
.
Rõ ràng "vấn đề" là cách thức multiprocessing.Pool.imap
chuyển đầu vào của nó cho các quy trình mới: nó sử dụng dưa chuột. Điều này không hoạt động với mmap
mảng numpy ed, và một cái gì đó bên trong vi phạm dẫn đến lỗi.
Tôi đã tìm thấy this reply bởi Robert Kern mà dường như giải quyết cùng một vấn đề. Ông đề nghị tạo một đường dẫn mã đặc biệt khi đầu vào imap
xuất phát từ mảng được ánh xạ bộ nhớ: ánh xạ bộ nhớ cùng một mảng theo cách thủ công trong quá trình sinh ra.
Điều này sẽ rất phức tạp và xấu xí đến mức tôi muốn sống với lỗi và các bản sao bộ nhớ bổ sung. Có cách nào khác sẽ nhẹ hơn khi sửa đổi mã hiện tại không?
Joe câu trả lời của bạn luôn luôn đá. Tôi đã cố gắng tìm ra một thứ như thế này. – YXD
Cảm ơn lời khuyên HDF. Trông giống như một sự thay đổi lớn nhưng nó có thể đáng giá, tôi sẽ kiểm tra nó. – user124114