Mam plik w następującym formacie:najskuteczniejszym sposobem analizować każdą czwartą linię z bardzo dużego pliku
1: some_basic_info_in_this_line
2: LOTS_OF_INFO_IN_THIS_LINE_HUNDREDS_OF_CHARS
3: some_basic_info_in_this_line
4: LOTS_OF_INFO_IN_THIS_LINE_HUNDREDS_OF_CHARS
...
To Format powtarza się dziesiątki tysięcy razy, dzięki czemu pliki do 50 Gib +. Potrzebuję skutecznego sposobu przetwarzania tylko linii 2 tego formatu. Jestem otwarty na używanie C, C++ 11 STL lub zwiększenie. Przejrzałem różne inne pytania dotyczące przesyłania plików na SO, ale mam wrażenie, że moja sytuacja jest wyjątkowa ze względu na duży rozmiar pliku i wymaga tylko jednej na cztery linie.
Mapowanie pamięci pliku wydaje się być najbardziej wydajne z tego, co przeczytałem, ale odwzorowanie pliku o wielkości 50 GB pochłonie większość komputerów RAM (można założyć, że ta aplikacja będzie używana przez "przeciętnych" użytkowników - powiedz 4-8 GiB RAM). Muszę też przetworzyć tylko jedną linię na raz. Oto jak jestem obecnie robi to (tak jestem świadomy tego nie jest skuteczny, dlatego jestem przeprojektowanie go):
std::string GL::getRead(ifstream& input)
{
std::string str;
std::string toss;
if (input.good())
{
getline(input, toss);
getline(input, str);
getline(input, toss);
getline(input, toss);
}
return str;
}
łamie mmap na bloki odpowiedź na moją sytuację? Czy jest tak, że mogę wykorzystać tylko 1 z 4 linii? Dzięki za pomoc.
Jeszcze raz zastanawiam się, kto to zajął. Jest to wystarczająco interesujące pytanie i jest dobrze postawione. +1 – sehe
Jeśli twój format jest ściśle określony przy użyciu rozmiarów linii, możesz użyć input.seekg, aby pominąć niepożądane linie. – Nir
Głównym wąskim gardłem będzie sama operacja wprowadzania. Sugeruję, abyś eksperymentował z różnymi sposobami ładowania bloku danych po bloku na typowym komputerze użytkownika. Nie wiem, jak najlepiej radzić sobie z linią, która okrakiem ma dwa bloki (w przypadku większości bloków będzie taka linia). –