2009-03-15 25 views
5

Sytuacja: istnieje plik z 14 294 508 liczbami całkowitymi bez znaku i 13 994 397 liczbami zmiennoprzecinkowymi (należy przeczytać double s). Całkowity rozmiar pliku wynosi ~ 250 MB.Jak szybko sformatować dane wejściowe ze strumienia w C++?

Korzystanie z std::istream trwa ~ 30sek. Odczytywanie danych z pliku do pamięci (tylko kopiowanie bajtów, bez sformatowanego wejścia) jest znacznie szybsze. Czy istnieje sposób na poprawę szybkości czytania bez zmiany formatu pliku?

+0

Myślę, że powinieneś opublikować swój kod pętli – Ben

+0

Jeśli to są biblioteki MSVC, możesz chcieć sprawdzić, jakie kary masz w SECURE_SCL (domyślnie włączone). Uważaj jednak, aby zrozumieć konsekwencje wyłączenia. – Functastic

+0

Niestety, powinno być: _SECURE_SCL – Functastic

Odpowiedz

3

Czy musisz używać styli STL i/o? Musisz sprawdzić this doskonałą pracę od jednego z ekspertów. Jest to specjalistyczny iostream Dietmar Kuhl.

Nienawidzę sugerować tego, ale przyjrzyj się procedurom wejścia/wyjścia w formacie C. Czy czytasz cały plik za jednym razem?

+0

Składnia i podejście nie ma znaczenia :) I tak, czytam cały plik. –

+0

Czy próbowałeś fscanf i przyjaciół? Powiedziałbym, daj im szansę i zmierz. – dirkgently

1

Można również zajrzeć do biblioteki FastFormat Matthew Wilsona:

nie zostały wykorzystane, ale robi całkiem imponujące roszczeń i znalazłem dużo jego drugiej pracy, aby być wartym studiowania i używania (i kradzieży przy okazji).

+0

Czy obsługuje on sformatowane dane wejściowe? –

+0

Crap - masz rację ... To tylko formatowanie wyjściowe. –

+0

Może techniki mogą być stosowane do wprowadzania danych – dcw

1

Nie określono formatu. Jest możliwe, że możesz ją zmapować lub przeczytać w bardzo dużych porcjach i przetworzyć w algorytmie wsadowym.

Nie powiedziałeś również, czy wiesz na pewno, że plik i proces, który je odczyta, będą znajdować się na tej samej platformie. Jeśli proces big-endianowy go zapisuje i proces little-endian czyta go, lub odwrotnie, to wygrał; t działa.

1

Analizowanie danych wejściowych przez użytkownika (atoi & atof), zwykle zwiększa prędkość co najmniej dwukrotnie, w porównaniu do "uniwersalnych" metod odczytu.

0

Coś szybki i brudny jest po prostu zrzucić plik do standardowego napisu C++, a następnie użyć stringstream na nim:

#include <sstream> 
// Load file into string file_string 
std::stringstream s(file_string); 
int x; float y; 
s >> x >> y; 

To może nie dać Ci dużo poprawy wydajności (dostaniesz większe przyspieszenie poprzez unikanie efektów dźwiękowych), ale bardzo łatwo go wypróbować i może być szybsze.

Powiązane problemy