Существует следующая проблема: есть некоторый файл с данными порядка нескольких сотен мегабайт (скажем, 300-500 Мб), задача состоит в том, чтобы произвольво выбирать из него данные. Однако есть несколько требований: программа не должна кушать слишком много памяти и процессорного времени, данные должны извлекаться как можно быстрей, т.е. свести к минимуму работу с жестким диском. Помогите, пожалуйста, придумать/выбрать алгоритм, который реализовал бы работу с учетом вышеперечисленных требований.
Можно заюзать маппинг (CreateFile,CreateFileMapping, MapViewOfFile, Flush/UnmapViewOfFile,CloseHandle) быстро, без явного чтения файла (оно из системного кеша происходит) Если это не устроит, можно выделять буфер равный размеру файла через VirtualAlloc и туда считывать весь файл, а оттуда уже обрабатывать. В случае с маппингом более 1 Гб размер обрабатывать не получится, в случае с виртуально памятью - без ограничений (в разумных пределах), можно более 1 Гб обрабатывать
eugene_, тут возникает проблема с потреблением программой оперативной памяти, которое желательно свести к минимуму. По крайней мере, это относится ко второму методу, если я не ошибаюсь.
Проблемы с оперативной памятью не возникают, т.к. видимо под термином "оперативная" ты имеешь в виду физическую память. Виртуальная память - суть своп, то есть файл подкачки, эта память занимает место только на диске и к физической памяти никакого отношения не имеет.
Под термином "оперативная память" я понимаю как физическую, так и виртуальную память. Файл подкачки наверное еще меньше подходит, чем физическая память, так как
Устанавливай указатель (SetFilePointer) произвольно и читай (ReadFile) минимально (базы данных для этого и придумали, чтобы ускорить доступ к требуемым данным)
Или создавай минимальный кеш (базы имеют кеш) для уменьшения файловых операций, или упреждающее чтение (не зная тип данных сложно говорить об универсальных методах)
eugene_ > "сложно говорить об универсальных методах" Правильно, поэтому имеет смысл использовать обычное буферированное чтение, как предлагает bogrus - худо-бедно винда сама если не все, то кое-что разрулит со своим файловым кэшем и упреждающим чтением