2015-05-29 21 views
7

Tôi có chức năng lấy id nút của biểu đồ làm đầu vào và tính toán thứ gì đó trong biểu đồ (không thay đổi đối tượng đồ thị), sau đó lưu kết quả trên hệ thống tệp, mã của tôi trông giống như sau:Làm thế nào để tiết kiệm bộ nhớ trong khi sử dụng Multiprocessing trong Python?

... 
# graph file is being loaded 
g = loadGraph(gfile='data/graph.txt') 
# list of nodeids is being loaded 
nodeids = loadSeeds(sfile='data/seeds.txt') 

import multiprocessing as mp 
# parallel part of the code 
print ("entering the parallel part ..") 
num_workers = mp.cpu_count() # 4 on my machine 
p = mp.Pool(num_workers) 
# _myParallelFunction(nodeid) {calculate something for nodeid in g and save it into a file} 
p.map(_myParallelFunction, nodeids) 
p.close() 
... 

Vấn đề là khi tôi tải đồ thị vào Python, nó mất rất nhiều bộ nhớ (khoảng 2G, nó là một đồ thị lớn với hàng nghìn nút thực sự), nhưng khi nó bắt đầu đi vào phần song song của mã thực hiện chức năng bản đồ) có vẻ như mọi quá trình đều được cung cấp một bản sao riêng biệt của g và tôi chỉ cần hết bộ nhớ trên máy của mình (nó có RAM 6G và trao đổi 3G), vì vậy tôi muốn thấy đó là cách để cung cấp cho mỗi quá trình cùng một bản sao của g sao cho chỉ có bộ nhớ để giữ một bản sao của nó sẽ được yêu cầu? bất kỳ đề xuất được đánh giá cao và cảm ơn trước.

+0

Tôi không biết đủ về điều này để cung cấp cho bạn câu trả lời chắc chắn, tuy nhiên một đề xuất sẽ là chia đồ thị thành phần nhỏ hơn và sau đó sử dụng quy trình để "chia và chinh phục" về cơ bản. – KronoS

+1

Bạn có thể đặt biểu đồ vào 'multiprocessing.Manager' tùy chỉnh, cho phép tất cả các quy trình sử dụng một biểu đồ được chia sẻ được lưu trữ trong quy trình' Trình quản lý'. Tuy nhiên, điều đó đi kèm với một hình phạt hiệu suất lớn khi bạn truy cập vào biểu đồ được chia sẻ, vì vậy nó có thể sẽ không cải thiện hiệu suất so với cách tiếp cận tuần tự. – dano

+1

Bạn có đang chạy ứng dụng này trên Windows không? Nếu bạn đang chạy nó trên Linux CoW lý tưởng nên kick vào và ngăn chặn nhiều bản sao của 'nodeIDs' được tạo ra. Xem [chú thích] này (http://rhodesmill.org/brandon/2010/python-multiprocessing-linux-windows/#comment-160800553) và bài viết liên quan – iruvar

Trả lời

1

Nếu chia đồ thị thành các phần nhỏ hơn không hoạt động, bạn có thể tìm giải pháp bằng cách sử dụng this hoặc multiprocessing.sharedctypes, tùy thuộc vào loại đồ thị của bạn.

1

bình luận của bạn cho thấy bạn đang xử lý một nút duy nhất tại một thời điểm:

# _myParallelFunction(nodeid) {calculate something for nodeid in g and save it into a file} 

tôi sẽ tạo ra một chức năng máy phát điện mà trả về một nút duy nhất từ ​​các tập tin đồ thị mỗi lần nó được gọi, và vượt qua máy phát điện đó để chức năng p.map() thay vì toàn bộ danh sách nodeids.

+0

'multiprocessing.Pool.map' sẽ biến trình tạo thành danh sách trước khi xử lý nó. Bạn phải sử dụng 'multiprocessing.pool.imap' để tránh điều đó. – dano

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