Моей средой является 32-разрядный XP. Я нахожу, когда выделенная память является почти максимальным размером, 2 ГБ, который означает, немного виртуального места является свободным, allocationnew память является очень медленным.
Таким образом, если у меня есть файл подкачки, мое приложение должно проанализировать их. У меня есть два пути. Нужно считать их всех в системную память, затем сделать анализ. Другой к reserv буфер памяти сначала как кэш, и считайте часть файла подкачки в тот буфер, проанализируйте и затем отбросьте его, затем считайте вторую часть файла подкачки, и переопределите кэш, сделайте анализ снова.
От профилирования выглядит, что второй быстрее, начиная с него избегают стоимости времени выделения.
Что Вы думаете? Спасибо в adavance.
(1) Я не уверен, что вопрос соответствует названию. Если вы выделяете почти 2 ГБ оперативной памяти на 32-битной Windows, то система, наверное, выкладывает на диск большое количество памяти, и именно на это я и посмотрел бы в первую очередь для замедления работы. Когда вы используете много памяти, вы должны думать о том, что она хранится на диске (в pagefile.sys), но кэшируется в физической оперативной памяти. Второй может быть быстрее не из-за затрат на выделение, а из-за затрат на использование большого объема памяти сразу. Фактически, когда вы копируете файл в одно большое выделение, вы копируете большую его часть на диск->диск через оперативную память, а затем, когда вы прогоняете его снова для анализа, вы снова загружаете копию обратно в оперативную память. Если ваш анализ представляет собой однопроходной алгоритм, то это большая избыточная работа.
(2) Что я думаю, так это mmap файл (MapViewOfFile и друзья на Windows).
Редактирование: (3) предостережение. Если в настоящее время объем файла составляет 1.8 ГБ, то в следующем году он может составить 4 ГБ. Если это так, то я бы планировал теперь, чтобы он имел размер больше 2^32 на 32-битной машине, что означает либо принять второй вариант, либо все же использовать MapViewOfFile, но делать это по одному разумному размеру кусок файла за раз, а не все сразу. Иначе вы будете пересматривать этот код, когда кто-то впервые попробует его на большом файле и сообщит об ошибке.
Вы забываете 3D Way - чтобы отобразить память на файл, см. Функция CreateFileMapping / mapviewoffile Это самый быстрый способ
Лучше всего использовать окна MapViewOfFile и аналогичные функции (Windows эквивалент mmap). Это позволит операционной системе управлять пейджингом в различных частях файла.
Почему объем выделенной памяти так велик? Если выделение памяти занимает разумное количество времени, то вы обнаружите, что делать это в памяти гораздо быстрее - мой подход заключается в том, чтобы делать это в памяти, и попытаться найти способ уменьшить использование памяти до такой степени, чтобы она снова стала быстрой.
Насколько я понимаю, вы либо сами управляете подкачкой, либо позвольте операционной системе управлять подкачкой за вас. В большинстве случаев я бы предложил позволить операционной системе обрабатывать подкачку (использовать виртуальную память). Поскольку я не доверяю операционным системам MS, я не могу рекомендовать этот метод, хотя ваш опыт может отличаться.