Я пишу фрагмент кода для чтения в нескольких ГБ данных, охватывающих несколько файлов, с использованием C ++ IOStreams, который я выбрал по сравнению с C API по ряду конструктивных причин, с которыми я не буду утомлять вас.Поскольку данные создаются отдельной программой на той же машине, где будет выполняться мой код, я уверен, что такие проблемы, как проблемы с порядком байтов, по большей части можно игнорировать.
Файлы имеютразумно сложная структура.Например, есть заголовок, который описывает количество записей конкретной двоичной конфигурации.Позже в файле я должен сделать так, чтобы код считывал это количество строк.Подобные паттерны повторяются сложным, но хорошо документированным образом.
Мой вопрос связан с тем, как сделать это эффективно - я уверен, что мой процесс будет ограничен по IO, поэтому мой инстинктзаключается в том, что вместо чтения данных в маленьких блоках, таких как следующий подход
std::vector<int> buffer;
buffer.reserve(500);
file.read( (char*)&buffer[0], 500 * sizeof(int));
, я должен читать по одному файлу за раз и пытаться обработать его в памяти.Итак, мои взаимосвязанные вопросы:
- Учитывая, что это может означать чтение в массиве char * или std :: vector, как бы вы лучше всего конвертировали этот массив в формат данных, необходимый для правильного представленияфайловая структура?
- Мои предположения неверны?
Я знаю, что очевидным ответом будет попытка, а затем профилирование позже, и профиль я, безусловно, буду.Но этот вопрос больше касается того, как правильно выбрать подход с самого начала - своего рода оптимизация «выбери правильный алгоритм», а не тот вид оптимизаций, который я мог бы предусмотреть после выявления узких мест позже!
Мне будут интересны предложенные ответы - я, как правило, могу найти ответы только для относительно простых двоичных файлов, для которых подходит вышеуказанный подход.Моя проблема в том, что основная часть двоичных данных условно структурирована по числам в заголовке файла (даже заголовок отформатирован таким образом!), Поэтому мне нужно иметь возможность обрабатывать файл немного более тщательно.
Заранее спасибо.
РЕДАКТИРОВАТЬ: Некоторые комментарии по поводу отображения памяти - выглядит хорошо, но не уверен, как это сделать, и все, что я прочитал, говорит мне, что это не такт портативный.Я заинтересован в том, чтобы попробовать mmap, но также и в более портативных решениях (если есть!)