Какой из них быстрее, читает с диска или выделяет системную память - PullRequest
6 голосов
/ 03 февраля 2010

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

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

Из профилирования выглядит, что второе быстрее, поскольку позволяет избежать затрат времени на выделение.

Что ты думаешь? Спасибо в аванс.

Ответы [ 5 ]

5 голосов
/ 03 февраля 2010

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

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

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

5 голосов
/ 03 февраля 2010

Вы забыли 3d способ - отобразить память на файл, см. Функцию CreateFileMapping / MapViewOfFile Это самый быстрый способ

1 голос
/ 03 февраля 2010

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

0 голосов
/ 03 февраля 2010

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

0 голосов
/ 03 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...