Я припускаю, що ваше запитання випливає із зауваження, що введення / виведення спричиняє значні накладні витрати у вашому аналізі. У цьому випадку можна спробувати перекрити введення / виведення обчисленнями.
Успішний підхід залежить від способу доступу до даних та обчислень, які ви виконуєте на цих даних. Якщо ви можете ідентифікувати шаблон або доступ до різних регіонів відомий заздалегідь, ви можете спробувати попередньо встановити "наступні фрагменти" даних у фоновому режимі під час обробки "поточних фрагментів".
Як простий приклад, якщо ви лише один раз переходите файл і обробляєте кожен рядок або набір рядків, ви можете розділити потік на шматки рядків (або МБ). Потім під час кожної ітерації над шматками ви можете завантажити шматок i + 1 під час обробки шматка i.
Ваша ситуація може бути більш складною і потребує більш залучених рішень. У будь-якому випадку ідея полягає у виконанні вводу / виводу у фоновому режимі, тоді як у процесора є деякі дані, над якими можна працювати. Якщо ви дасте більше детальних даних щодо вашої конкретної проблеми, ми можемо глибше розглянути її;)
---- Розширена версія після детальної інформації ----
Я не впевнений, що розумію позначення, але добре, як ви сказали, ідея - це взаємодія "все до всіх". Ви також згадуєте, що дані можуть вміщуватися в оперативній пам'яті. Тоді я б почав з вимірювання часу для завантаження всіх даних та часу для проведення обчислень. Тепер,
якщо відсоток вводу / виводу низький (низький, як у вас не байдуже накладні витрати, що б це не було: 0,5%, 2%, 5%, ...), просто використовуйте простий підхід: завантажуйте дані одразу і обчислити. Ви заощадите час на більш цікаві аспекти ваших досліджень.
якщо ви не можете дозволити собі накладні витрати, ви можете розглянути, що запропонував Педро. Майте на увазі те, що згадав Арон Ахмадія, і протестуйте його, перш ніж перейти до повної реалізації.
якщо попереднє не буде задовільним, я б пішов на деяку позапрофільну реалізацію [1]. Оскільки здається, що ви виконуєте обчислення на даних, є надія :) Деякі псевдокоди (якщо вважати, що результати вашого аналізу вміщуються в оперативній пам'яті):н2н
завантажувати шматок1 і шматок2
для шматок i = 1 до n
асинхронно завантажують шматок i + 1
для шматок у j = i + 1 до n
асинхронне навантаження шматка j + 1
обчислити шматки i, j (* для першої ітерації, це попередньо завантажені фрагменти 1 і 2 *)
Примітка: це швидкий і брудний псевдокод, потрібно було б скоригувати індекси.
Для цього звичайно використовувати так зване подвійне буферизація . Грубо кажучи: розділіть пам’ять на дві робочі області; поки дані завантажуються у фоновому режимі в робочу область 1, процесор обчислює дані в робочій області 2. Під час кожної ітерації обмінюйтесь роллю.
Вибачте, що зараз не можу прийти до хорошого посилання.
[1] Непрофільний алгоритм містить деякий механізм (ефективно) обробляти дані, що зберігаються на диску. Вони називаються позаядерними на відміну від in-core ("in-RAM").
mmap
у свій основний код. Багато сучасних операційних систем дають аналогічні показники між звичайнимиread
з меншими складностями. (Також так, mmap в Python забезпечує портативний інтерфейс до карт пам'яті Windows та UNIX).