Tôi đang sử dụng multiprocessing.imap_unordered
để thực hiện một tính toán trên một danh sách các giá trị:đa Python và bộ nhớ
def process_parallel(fnc, some_list):
pool = multiprocessing.Pool()
for result in pool.imap_unordered(fnc, some_list):
for x in result:
yield x
pool.terminate()
Mỗi cuộc gọi đến fnc
trả về một đối tượng HUGE kết quả là do thiết kế. Tôi có thể lưu trữ N trường hợp của đối tượng như vậy trong RAM, trong đó N ~ cpu_count, nhưng không nhiều hơn (không phải hàng trăm).
Hiện tại, việc sử dụng chức năng này chiếm quá nhiều bộ nhớ. Bộ nhớ là hoàn toàn chi tiêu trong quá trình chính, không phải trong công nhân.
Làm thế nào để imap_unordered
lưu trữ kết quả đã hoàn thành? Tôi có nghĩa là các kết quả đã được trả về bởi công nhân nhưng chưa được chuyển cho người dùng. Tôi nghĩ rằng nó là thông minh và chỉ tính chúng "lười biếng" khi cần thiết, nhưng dường như không.
Có vẻ như tôi không thể tiêu thụ kết quả của process_parallel
đủ nhanh, hồ bơi tiếp tục xếp hàng các vật thể khổng lồ này từ fnc
ở đâu đó, bên trong và sau đó thổi lên. Có cách nào để tránh điều này không? Hạn chế hàng đợi nội bộ của nó bằng cách nào đó?
Tôi đang sử dụng Python2.7. Chúc mừng.
Cũng từ những gì tôi nhìn thấy 'yield' là trong quá trình chính, không phải bên trong' fnc' (tức là, chức năng được thực hiện bởi các công nhân). là 'fnc' chính nó làm đánh giá lười biếng? – Felix
@ FelixBonkoski Không, 'fnc' lấy một mục duy nhất từ' some_list', và tính toán và trả về một đối tượng khổng lồ từ nó. – user124114
Chỉ giới hạn tốc độ dựa trên bộ nhớ khả dụng. –