У меня есть большие файлы, содержащие небольшое количество больших наборов данных. Каждый набор данных содержит имя и размер набора данных в байтах, что позволяет пропустить его и перейти к следующему набору данных.C++/Быстрый пропуск произвольного доступа в большом файле
Я хочу быстро создать индекс имен наборов данных. Пример файла - около 21 МБ и содержит 88 наборов данных. Чтение 88 имен быстро с помощью std::ifstream
и seekg()
для пропуска между наборами данных занимает около 1300 мс, что я хотел бы уменьшить.
На самом деле, я читаю 88 кусков около 30 байт, на данных позициях в файле 21 МБ, и это занимает 1300 мс.
Есть ли способ улучшить это, или это ограничение ОС и файловой системы? Я запускаю тест под Windows 7 64bit.
Я знаю, что иметь полный индекс в начале файла будет лучше, но формат файла не имеет этого, и мы не можем его изменить.
Некоторые подсказки на http://stackoverflow.com/questions/5166263/how-to-get-iostream-to-perform-better –
Являются ли эти текстовые файлы? Сохраняет ли Windows как возврат каретки, так и линию в конце строк? Если это так, ищет ли поиск по логическому текстовому файлу с ifstream, отфильтровывая символы возврата каретки? Если это так, возможно, вы можете открыть файл в необработанном двоичном режиме и, таким образом, запретить функции поиска читать все символы, чтобы избежать включения CR в смещение поиска? Но тогда, конечно, ваш код, возможно, придется игнорировать нефильтрованные возвращения каретки. – WaltK
Разделение в 88 небольших файлов с неизменным форматом данных - опция для вас? – norca