У меня есть файл в следующем формате:Наиболее эффективный способ разобрать каждую четвертую строку из очень большого файла
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
...
Этот формат повторяется десятки тысяч раз, что делает файлы до 50 GiB +. Мне нужен эффективный способ обработки только строки 2 этого формата. Я открыт для использования C, C++ 11 STL или boost. Я рассмотрел различные другие вопросы, касающиеся потоковой передачи файлов на SO, но я чувствую, что моя ситуация уникальна из-за большого размера файла и только одна из каждых четырех строк.
Память, сопоставляющая файл, кажется наиболее эффективной из того, что я читал, но отображение файла с более чем 50 ГБ будет потреблять большую часть ОЗУ компьютера (вы можете предположить, что это приложение будет использоваться «средними» пользователями - скажем, 4-8 ГБ ОЗУ). Также мне нужно будет только обрабатывать одну из строк за раз. Вот как я сейчас делаю это (да я знаю, что это не эффективно, поэтому я перепроектирование его):
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;
}
ломает ММАП в блоки ответа для моей ситуации? В любом случае, я могу использовать только 1 из 4 строк? Спасибо за помощь.
Опять же, я задаюсь вопросом, кто это проигнорировал. Это достаточно интересный вопрос и хорошо поставлен. +1 – sehe
Если ваш формат строго определен с размерами строк, вы можете использовать input.seekg для пропуска нежелательных строк. – Nir
Главное узкое место будет в самой операции ввода. Я предлагаю вам экспериментировать с различными способами загрузки блока данных блоком на обычном компьютере пользователя. Не знаете, как лучше всего обрабатывать линию, которая разделяет два блока (такая строка будет для большинства блоков). –