Saya berasumsi pertanyaan Anda berasal dari pengamatan bahwa I / O menyebabkan overhead yang signifikan dalam seluruh analisis Anda. Dalam hal ini, Anda dapat mencoba untuk tumpang tindih I / O dengan perhitungan.
Pendekatan yang berhasil tergantung pada bagaimana Anda mengakses data, dan perhitungan yang Anda lakukan pada data itu. Jika Anda dapat mengidentifikasi pola, atau akses ke berbagai wilayah data diketahui sebelumnya, Anda dapat mencoba untuk mengambil "potongan berikutnya" dari data di latar belakang saat memproses "potongan saat ini".
Sebagai contoh sederhana, jika Anda hanya menelusuri file sekali dan memproses setiap baris atau kumpulan baris, Anda dapat membagi aliran dalam potongan baris (atau MB). Kemudian, pada setiap iterasi di atas chunk, Anda dapat memuat chunk i +1 saat memproses chunk i.
Situasi Anda mungkin lebih kompleks dan membutuhkan lebih banyak solusi yang terlibat. Bagaimanapun, idenya adalah untuk melakukan I / O di latar belakang sementara prosesor memiliki beberapa data untuk dikerjakan. Jika Anda memberikan detail lebih lanjut tentang masalah spesifik Anda, kami mungkin dapat memeriksanya lebih dalam;)
---- Versi diperpanjang setelah memberikan rincian lebih lanjut ----
Saya tidak yakin saya mengerti notasinya, tetapi yah, seperti yang Anda katakan, idenya adalah interaksi semua-untuk-semua. Anda juga menyebutkan bahwa data mungkin sesuai dengan RAM. Kemudian, saya akan mulai dengan mengukur waktu untuk memuat semua data dan waktu untuk melakukan perhitungan. Sekarang,
jika persentase I / O rendah (serendah Anda tidak peduli dengan overhead, apa pun itu: 0,5%, 2%, 5%, ...), maka gunakan saja pendekatan sederhana: memuat data sekaligus, dan hitung. Anda akan menghemat waktu untuk aspek penelitian yang lebih menarik.
jika Anda tidak mampu membayar biaya overhead, Anda mungkin ingin melihat apa yang disarankan Pedro. Ingatlah apa yang disebutkan Aron Ahmadia, dan ujilah sebelum melanjutkan untuk implementasi penuh.
jika sebelumnya tidak memuaskan, saya akan pergi untuk implementasi out-of-core [1]. Karena tampaknya Anda melakukan perhitungan pada data , ada harapan :) Beberapa pseudocode (dengan asumsi hasil analisis Anda sesuai dengan RAM):n2n
memuat chunk1 dan chunk2
untuk potongan i = 1 hingga n
secara asinkron memuat chunk i +1
untuk potongan di j = i +1 ke n
secara asinkron memuat chunk j +1
hitung dengan potongan i, j (* untuk iterasi pertama, ini adalah potongan preloaded 1 dan 2 *)
Catatan: ini adalah kodesemu cepat dan kotor, kita harus menyesuaikan indeks.
Untuk mengimplementasikan ini, adalah umum untuk menggunakan yang disebut double-buffering . Secara kasar: bagi memori dalam dua ruang kerja; saat data dimuat di latar belakang ke dalam ruang kerja 1, prosesor menghitung dengan data di ruang kerja 2. Pada setiap iterasi, tukar peran.
Maaf saya tidak bisa membuat referensi yang bagus saat ini.
[1] Algoritma out-of-core menggabungkan beberapa mekanisme untuk (efisien) menangani data yang berada di disk. Mereka disebut out-of-core sebagai lawan in-core ("in-RAM").
mmap
ke dalam kode utama Anda. Banyak sistem operasi modern memberikan kinerja serupa antara regulerread
dengan komplikasi yang lebih sedikit. (Juga, ya, mmap di Python menyediakan antarmuka portabel ke peta memori Windows dan UNIX).Mungkin Anda dapat menggunakan Cython di bagian I / O file Anda dan mengubah bagian ini menjadi kode C?
sumber