2013-06-06 36 views
5

Tôi tự hỏi về sự cân bằng giữa việc đọc các tệp theo thứ tự so với song song.Tuần tự hoặc song song: cách thích hợp để đọc nhiều tệp trong python là gì?

Giả sử tôi có một tệp có kích thước hàng triệu megabyte mà tôi muốn xử lý, nhưng không đủ bộ nhớ để giữ tất cả chúng cùng một lúc. Để xử lý những tuần tự, tôi có thể làm:

results = [do_something(os.path.join(files, f)) for f in os.listdir(files)] 

Hoặc tôi có thể làm điều đó trong song song:

paths = [os.path.join(files, f) for f in os.listdir(files)] 
p = multiprocessing.Pool() 
try: 
    results = p.map(do_something, paths) 
    p.close() 
    p.join() 
except KeyboardInterrupt: 
    p.terminate() 

Nói chung tôi đã cảnh báo chống lại việc thực hiện song song I/O vì đọc đĩa ngẫu nhiên là khá chậm. Nhưng trong trường hợp này là song song với con đường để đi? Hoặc có lẽ một số chiến lược hỗn hợp?

Ngoài ra, tôi nhận thấy rằng phiên bản song song duy trì cấu trúc của thư mục; đó là để nói, đầu ra là đúng thứ tự. Điều đó có nghĩa rằng nó thực sự làm nó tuần tự, hoặc là python chỉ là loại? Chỉnh sửa: Máy xay sinh tố đã xóa câu hỏi thứ hai này. Cảm ơn, Blender!

Cảm ơn sự giúp đỡ.

+4

'p.map' trả về mọi thứ theo thứ tự. Bạn có thể muốn xem 'p.map_async' hoặc 'p.imap_unordered' – Blender

+0

phụ thuộc vào những gì do_something làm – yaccz

+0

Bạn có thể giả sử do_something là một hàm khá đắt tiền phân tích nội dung của tệp. – rhombidodecahedron

Trả lời

2

Phần này phụ thuộc vào loại phương tiện lưu trữ mà họ đang sử dụng. Một ổ đĩa cứng thông thường sẽ thu thập dữ liệu gần như tạm dừng do hoạt động tìm kiếm. Một SSD, OTOH, ít nhạy cảm hơn với các lần đọc ngẫu nhiên (mặc dù nó không hoàn toàn không bị ảnh hưởng).

Thậm chí nếu bạn có ổ SSD, bạn có thể thấy rằng có điểm giảm dần mặc dù kích thước hồ bơi mặc định có thể tốt và bạn thậm chí có thể thấy rằng điểm ngọt cao hơn nhiều so với cpu_count(). Có quá nhiều yếu tố để thực hiện bất kỳ dự đoán nào, vì vậy bạn nên thử các kích thước hồ bơi khác nhau.

2

Xử lý song song sẽ bị tổn thương bởi đĩa IO nếu bạn có nhiều truy cập đĩa trên mỗi tệp. Tuy nhiên, nếu bạn đang xử lý đủ ít trong do_something nó có thể không đáng để xử lý cần thiết cho việc chuyển ngữ cảnh sẽ xảy ra trong nhóm luồng. Vì bạn nói rằng do_something là đắt tiền đáng kể, nó có lẽ là giá trị xử lý song song.

Ngoài ra, bạn có thể giảm thiểu đĩa IO nếu bạn chỉ đọc các tệp hoàn toàn vào bộ nhớ một lần so với đọc từng dòng tệp. Tất nhiên điều này sẽ đòi hỏi nhiều bộ nhớ hơn, nhưng nó có thể sẽ làm giảm đáng kể thời gian xử lý.

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