Tôi cho rằng câu hỏi của bạn xuất phát từ việc quan sát rằng I / O gây ra một chi phí đáng kể trong toàn bộ phân tích của bạn. Trong trường hợp đó, bạn có thể thử chồng chéo I / O với tính toán.
Cách tiếp cận thành công phụ thuộc vào cách bạn truy cập dữ liệu và tính toán bạn thực hiện trên dữ liệu đó. Nếu bạn có thể xác định một mẫu hoặc quyền truy cập vào các vùng khác nhau của dữ liệu đã được biết trước, bạn có thể thử tìm nạp trước "khối tiếp theo" của dữ liệu trong nền trong khi xử lý "khối hiện tại".
Ví dụ đơn giản, nếu bạn chỉ duyệt qua tệp của mình một lần và xử lý từng dòng hoặc tập hợp các dòng, bạn có thể chia luồng theo từng dòng (hoặc MB). Sau đó, tại mỗi lần lặp qua các khối, bạn có thể tải chunk i + 1 trong khi xử lý chunk i.
Tình hình của bạn có thể phức tạp hơn và cần nhiều giải pháp liên quan hơn. Trong mọi trường hợp, ý tưởng là thực hiện I / O trong nền trong khi bộ xử lý có một số dữ liệu để làm việc. Nếu bạn cung cấp thêm chi tiết về vấn đề cụ thể của mình, chúng tôi có thể có thể xem xét sâu hơn về vấn đề đó;)
---- Phiên bản mở rộng sau khi cung cấp thêm chi tiết ----
Tôi không chắc là tôi hiểu ký hiệu, nhưng, như bạn đã nói, ý tưởng là một sự tương tác tất cả. Bạn cũng đề cập rằng dữ liệu có thể phù hợp với RAM. Sau đó, tôi sẽ bắt đầu bằng cách đo thời gian để tải tất cả dữ liệu và thời gian để thực hiện tính toán. Hiện nay,
nếu tỷ lệ phần trăm của I / O thấp (thấp như bạn không quan tâm đến chi phí hoạt động, dù đó là gì: 0,5%, 2%, 5%, ...), thì chỉ cần sử dụng phương pháp đơn giản: tải dữ liệu cùng một lúc, và tính toán. Bạn sẽ tiết kiệm thời gian cho các khía cạnh thú vị hơn của nghiên cứu của bạn.
nếu bạn không đủ khả năng chi trả, bạn có thể muốn xem xét những gì Pedro đề xuất. Hãy ghi nhớ những gì Aron Ahmadia đã đề cập, và kiểm tra nó trước khi thực hiện đầy đủ.
nếu trước đó là không thỏa đáng, tôi sẽ đi cho một số out-of-core thực hiện [1]. Vì có vẻ như bạn đang thực hiện tính toán trên dữ liệu , nên có hy vọng :) Một số mã giả (giả sử kết quả phân tích của bạn phù hợp với RAM):n2n
tải chunk1 và chunk2
cho khối i = 1 đến n
tải không đồng bộ chunk i + 1
cho các khối trong j = i + 1 đến n
tải không đồng bộ chunk j + 1
tính toán với các đoạn i, j (* cho lần lặp đầu tiên, đây là các đoạn được tải sẵn 1 và 2 *)
Lưu ý: đây là mã giả nhanh và bẩn, người ta sẽ cần điều chỉnh các chỉ số.
Để thực hiện điều này, người ta thường sử dụng cái gọi là bộ đệm đôi . Nói một cách đơn giản: phân chia bộ nhớ trong hai không gian làm việc; trong khi dữ liệu đang được tải trong nền vào không gian làm việc 1, bộ xử lý đang tính toán với dữ liệu trong không gian làm việc 2. Tại mỗi lần lặp, trao đổi vai trò.
Tôi xin lỗi tôi không thể đến với một tài liệu tham khảo tốt ngay bây giờ.
[1] Một thuật toán bên ngoài kết hợp một số cơ chế để (xử lý) hiệu quả với dữ liệu cư trú trên đĩa. Chúng được gọi là ngoài lõi so với trong lõi ("trong RAM").
mmap
vào mã chính của bạn. Nhiều hệ điều hành hiện đại cho hiệu năng tương tự giữa thường xuyênread
với ít biến chứng. (Ngoài ra, có, mmap trong Python cung cấp giao diện di động cho bản đồ bộ nhớ Windows và UNIX).