2010-04-24 37 views
5

Tôi đang cố gắng sử dụng thư viện đa xử lý của python để hy vọng đạt được một số hiệu suất. Cụ thể là tôi đang sử dụng hàm map của nó. Bây giờ, vì một số lý do khi tôi trao đổi nó với đối tác được xử lý duy nhất của nó, tôi không nhận được sử dụng bộ nhớ cao. Nhưng sử dụng phiên bản đa xử lý của bản đồ làm cho bộ nhớ của tôi đi qua mái nhà. Đối với các hồ sơ tôi đang làm một cái gì đó mà có thể dễ dàng hog lên vô số bộ nhớ, nhưng những gì sẽ là sự khác biệt giữa hai để gây ra một sự khác biệt rõ rệt như vậy?Chỉ sử dụng bộ nhớ cao khi đa xử lý

+0

Đối với bản ghi, âm thanh này không giống như bộ nhớ * rò rỉ *, giống như bộ nhớ * sử dụng *. –

+0

Rất đúng, một lần nữa, từ ngữ xấu về phía tôi. – Sandro

Trả lời

4

Bạn nhận ra rằng đa xử lý không sử dụng đề tài, phải không? Tôi nói điều này bởi vì bạn đề cập đến một "đối tác luồng đơn".

Bạn đang gửi nhiều dữ liệu qua multiprocessing 's map? Một nguyên nhân có thể là quá trình đa xử lý tuần tự phải làm trong nhiều trường hợp. multiprocessing sử dụng pickle, thường chiếm nhiều bộ nhớ hơn dữ liệu mà nó đang tẩy. (Trong một số trường hợp, cụ thể là trên các hệ thống có fork() nơi các quy trình mới được tạo khi bạn gọi phương thức map, nó có thể tránh việc tuần tự hóa, nhưng bất cứ khi nào cần gửi dữ liệu mới đến quy trình hiện tại, nó không thể làm như vậy.)

với multiprocessing tất cả các công việc thực tế được thực hiện trong các quy trình riêng biệt, bộ nhớ của quá trình chính của bạn sẽ không bị ảnh hưởng bởi các hoạt động thực tế bạn thực hiện. Việc sử dụng toàn bộ bộ nhớ sẽ tăng lên một chút, tuy nhiên, vì mỗi quy trình công nhân đều có một bản sao dữ liệu bạn đã gửi qua. Đôi khi, bộ nhớ copy-on-write (trong cùng trường hợp không serializing) trên các hệ thống có CoW, nhưng việc sử dụng bộ nhớ của Python là như vậy mà nó nhanh chóng được ghi vào và do đó được sao chép.

+0

Phải, xin lỗi về điều đó tôi biết rằng đa xử lý không thực sự sử dụng các chủ đề. (Do đó tên) Vì vậy, gửi thông tin trên đường ống là những gì đang giết chết nó. Làm cho rất nhiều ý nghĩa. Bạn có biết bất kỳ giải pháp nào cho vấn đề mà tôi đang gặp phải không? – Sandro

+1

Gửi ít dữ liệu hơn. Hoặc, gửi nó qua các đoạn nhỏ hơn. Hoặc, nếu bạn đang trên một hệ thống với fork(), làm cho nó để serialization không xảy ra: đảm bảo multiprocessing sẽ bắt đầu quá trình mới. –

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