Zakładam, że twoje pytanie pochodzi z obserwacji, że I / O powoduje znaczny narzut w całej twojej analizie. W takim przypadku możesz spróbować pokryć operacje we / wy obliczeniami.
Udane podejście zależy od tego, jak uzyskujesz dostęp do danych i obliczeń, które wykonujesz na tych danych. Jeśli potrafisz zidentyfikować wzór lub dostęp do różnych regionów danych jest wcześniej znany, możesz spróbować pobrać „kolejne fragmenty” danych w tle podczas przetwarzania „bieżących fragmentów”.
Jako prosty przykład, jeśli przejdziesz plik tylko raz i przetworzysz każdą linię lub zestaw linii, możesz podzielić strumień na kawałki linii (lub MB). Następnie, przy każdej iteracji nad porcjami, możesz załadować porcję i + 1 podczas przetwarzania porcji i.
Twoja sytuacja może być bardziej złożona i wymagać bardziej zaangażowanych rozwiązań. W każdym razie chodzi o to, aby wykonać operacje wejścia / wyjścia w tle, podczas gdy procesor ma dane do pracy. Jeśli podasz więcej szczegółów na temat konkretnego problemu, możemy być w stanie przyjrzeć się mu głębiej;)
---- Wersja rozszerzona po podaniu więcej szczegółów ----
Nie jestem pewien, czy rozumiem notację, ale, jak powiedziałeś, pomysł polega na interakcji typu „wszystko dla wszystkich”. Wspominasz również, że dane mogą zmieścić się w pamięci RAM. Następnie zacznę od pomiaru czasu załadowania wszystkich danych i czasu wykonania obliczeń. Teraz,
jeśli procent we / wy jest niski (niski, ponieważ u ciebie nie zależy na kosztach ogólnych, cokolwiek to jest: 0,5%, 2%, 5%, ...), po prostu zastosuj proste podejście: załaduj dane od razu i oblicz. Zaoszczędzisz czas na bardziej interesujące aspekty swoich badań.
jeśli nie możesz sobie pozwolić na koszty ogólne, możesz zajrzeć do sugestii Pedro. Pamiętaj, o czym wspomniał Aron Ahmadia, i przetestuj to, zanim przejdziesz do pełnej implementacji.
n2)n
ładuj porcję 1 i porcję 2
dla fragmentów i = 1 do n
asynchronicznie ładuj porcję i + 1
dla fragmentów w j = i + 1 do n
asynchronicznie ładuj porcję j + 1
oblicz z fragmentami i, j (* dla pierwszej iteracji są to wstępnie załadowane fragmenty 1 i 2 *)
Uwaga: jest to szybki i nieprzyzwoity pseudokod, należałoby dostosować wskaźniki.
Aby to zaimplementować, powszechnie stosuje się tak zwane podwójne buforowanie . Z grubsza mówiąc: podziel pamięć na dwa obszary robocze; podczas ładowania danych w tle do obszaru roboczego 1, procesor oblicza dane w obszarze roboczym 2. Przy każdej iteracji wymieniaj rolę.
Przepraszam, że nie mogę teraz znaleźć dobrego odniesienia.
[1] Out-of-core algorytm zawiera pewien mechanizm (efektywnie) radzenia sobie z danymi znajdującymi się na dysku. Są one nazywane poza rdzeniem, a nie w rdzeniu („w pamięci RAM”).
mmap
w swoim głównym kodzie. Wiele nowoczesnych systemów operacyjnych zapewnia podobną wydajność między zwykłymiread
i mniej skomplikowanymi. (Tak, mmap w Pythonie zapewnia przenośny interfejs map pamięci systemu Windows i UNIX).Być może możesz użyć Cython w sekcjach We / Wy pliku i przekonwertować tę część na kod C.
źródło