Какой быстрее, читая из диска, или выделите системную память

Моей средой является 32-разрядный XP. Я нахожу, когда выделенная память является почти максимальным размером, 2 ГБ, который означает, немного виртуального места является свободным, allocationnew память является очень медленным.

Таким образом, если у меня есть файл подкачки, мое приложение должно проанализировать их. У меня есть два пути. Нужно считать их всех в системную память, затем сделать анализ. Другой к reserv буфер памяти сначала как кэш, и считайте часть файла подкачки в тот буфер, проанализируйте и затем отбросьте его, затем считайте вторую часть файла подкачки, и переопределите кэш, сделайте анализ снова.

От профилирования выглядит, что второй быстрее, начиная с него избегают стоимости времени выделения.

Что Вы думаете? Спасибо в adavance.

6
задан Buzz 3 February 2010 в 13:18
поделиться

5 ответов

(1) Я не уверен, что вопрос соответствует названию. Если вы выделяете почти 2 ГБ оперативной памяти на 32-битной Windows, то система, наверное, выкладывает на диск большое количество памяти, и именно на это я и посмотрел бы в первую очередь для замедления работы. Когда вы используете много памяти, вы должны думать о том, что она хранится на диске (в pagefile.sys), но кэшируется в физической оперативной памяти. Второй может быть быстрее не из-за затрат на выделение, а из-за затрат на использование большого объема памяти сразу. Фактически, когда вы копируете файл в одно большое выделение, вы копируете большую его часть на диск->диск через оперативную память, а затем, когда вы прогоняете его снова для анализа, вы снова загружаете копию обратно в оперативную память. Если ваш анализ представляет собой однопроходной алгоритм, то это большая избыточная работа.

(2) Что я думаю, так это mmap файл (MapViewOfFile и друзья на Windows).

Редактирование: (3) предостережение. Если в настоящее время объем файла составляет 1.8 ГБ, то в следующем году он может составить 4 ГБ. Если это так, то я бы планировал теперь, чтобы он имел размер больше 2^32 на 32-битной машине, что означает либо принять второй вариант, либо все же использовать MapViewOfFile, но делать это по одному разумному размеру кусок файла за раз, а не все сразу. Иначе вы будете пересматривать этот код, когда кто-то впервые попробует его на большом файле и сообщит об ошибке.

5
ответ дан 9 December 2019 в 22:34
поделиться

Вы забываете 3D Way - чтобы отобразить память на файл, см. Функция CreateFileMapping / mapviewoffile Это самый быстрый способ

5
ответ дан 9 December 2019 в 22:34
поделиться

Лучше всего использовать окна MapViewOfFile и аналогичные функции (Windows эквивалент mmap). Это позволит операционной системе управлять пейджингом в различных частях файла.

1
ответ дан 9 December 2019 в 22:34
поделиться

Почему объем выделенной памяти так велик? Если выделение памяти занимает разумное количество времени, то вы обнаружите, что делать это в памяти гораздо быстрее - мой подход заключается в том, чтобы делать это в памяти, и попытаться найти способ уменьшить использование памяти до такой степени, чтобы она снова стала быстрой.

0
ответ дан 9 December 2019 в 22:34
поделиться

Насколько я понимаю, вы либо сами управляете подкачкой, либо позвольте операционной системе управлять подкачкой за вас. В большинстве случаев я бы предложил позволить операционной системе обрабатывать подкачку (использовать виртуальную память). Поскольку я не доверяю операционным системам MS, я не могу рекомендовать этот метод, хотя ваш опыт может отличаться.

0
ответ дан 9 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: