w skrócie, główne różnice IMO:
- Powinieneś wiedzieć wcześniej, co się prawdopodobny wąskim gardłem będzie (I/O lub CPU) i skupi się na najlepszym algorytmie i infrastrukturze , aby rozwiązać ten problem. I/O dość często jest wąskim gardłem.
- Wybór i dostrajanie algorytmu często dominuje nad każdym innym dokonanym wyborem.
- Nawet niewielkie zmiany algorytmów i wzorców dostępu mogą wpływać na wydajność rzędu rzędów wielkości. Bardzo dużo zoptymalizujesz. "Najlepsze" rozwiązanie będzie zależne od systemu.
- Porozmawiaj ze swoimi kolegami i innymi naukowcami, aby czerpać korzyści z ich doświadczeń z tymi zestawami danych . W podręcznikach nie można znaleźć wielu sztuczek.
- Wstępne przetwarzanie i przechowywanie może być bardzo skuteczne.
pasma I/O
Początkowo pasma I/O często stanowi wąskie gardło. Aby dać ci perspektywę: przy teoretycznym limicie SATA 3, odczyt 1 TB zajmuje około 30 minut. Jeśli potrzebujesz dostępu losowego, przeczytaj kilka razy lub napisz, chcesz to zrobić w pamięci przez większość czasu lub potrzebujesz czegoś znacznie szybciej (np.iSCSI z InfiniBand). Twój system powinien być w stanie zrobić to najlepiej, aby maksymalnie zbliżyć się do teoretycznego limitu dowolnego interfejsu, z którego korzystasz. Na przykład zwykłe uzyskiwanie dostępu do różnych plików równolegle w różnych procesach lub HDF5 na szczycie MPI-2 I/O jest dość powszechne. W idealnej sytuacji wykonuje się równolegle obliczenia i operacje we/wy, aby jeden z nich był "bezpłatny".
Klastry
W zależności od przypadku, albo I/O lub moc procesora niż być wąskim gardłem. Niezależnie od tego, który z nich jest, zwiększanie wydajności można uzyskać dzięki klastrom, jeśli można skutecznie dystrybuować swoje zadania (przykład: MapReduce). Może to wymagać zupełnie innych algorytmów niż typowe przykłady podręczników. Poświęcanie czasu na rozwój to często najlepszy czas.
Algorytmy
w wyborze pomiędzy algorytmami, big O algorytmu jest bardzo ważne, ale algorytmy o podobnym Big O może być znacznie różni się w zależności od wydajności miejscowości. Im mniej lokalny jest algorytm (tj. Im więcej brakuje pamięci podręcznej i brakuje pamięci głównej), tym gorsza wydajność - dostęp do pamięci jest zwykle o rząd wielkości wolniejszy niż pamięć główna. Klasycznymi przykładami ulepszeń będzie tiling dla multiplikacji macierzy lub loop interchange.
komputerowe, językowe, Narzędzia specjalistyczne
Jeśli gardłem jest I/O, oznacza to, że algorytmy dla dużych zbiorów danych mogą korzystać z większej pamięci głównej (na przykład 64-bitowy) lub języków programowania/struktur danych z mniejsze zużycie pamięci (np. w Pythonie __slots__
może być przydatne), ponieważ większa pamięć może oznaczać mniej operacji we/wy na czas procesora. BTW, systemy z TBs pamięci głównej nie są niespotykane (np. HP Superdomes). Podobnie, jeśli wąskim gardłem jest procesor, szybsze maszyny, języki i kompilatory, które umożliwiają korzystanie ze specjalnych funkcji architektury (np. SIMD, takich jak SSE), mogą zwiększyć wydajność o rząd wielkości.
Sposób wyszukiwania i uzyskiwania dostępu do danych oraz przechowywania informacji meta może być bardzo ważny dla wydajności. Często używasz plików płaskich lub niestandardowych pakietów specyficznych dla domeny do przechowywania danych (np. Nie jako relacyjnej bazy danych bezpośrednio), które umożliwiają bardziej efektywny dostęp do danych. Na przykład: kdb+ jest specjalistyczną bazą danych dla dużych serii czasowych, a ROOT używa obiektu TTree
do wydajnego dostępu do danych. Wspomniany przykład to kolejny przykład.
Przy obecnie dość powszechnej architekturze 64-bitowej komputery * mogą * zaadresować tyle pamięci: 64-bitowe oznacza, że adres może być około 2 ** 32 ~ 4 miliard razy większy niż adresy komputerów 32-bitowych. To * jest * wystarczające dla twoich danych. – EOL