WIn64 отображенные в память файлы и блокировка страниц - PullRequest
3 голосов
/ 25 ноября 2011

Мне нужно захватывать большие объемы (4-8 ГБ) данных в режиме реального времени - без удаления каких-либо данных.

Старая система могла почти не отставать от записи данных в чередующийся RAID-массив, но данныестал больше, быстрее, чем диск стал быстрее (!) Так что у меня нет времени на доступ к диску.
Новый план - переключиться на Win64, установить LOTS из оперативной памяти, собрать входящие данные в буфери затем напишите все в конце.

Итак, я ищу:
Windows API, который ограничивает new [] для физической памяти и блокирует страницы в физической памяти, или я просто отключаю файл подкачки.

Или я использую отображенные в памяти файлы и принудительно синхронизирую их в конце, когда закрываю файл.Есть ли флаг файла памяти, который препятствует записи, пока я не буду готов?

Ответы [ 3 ]

5 голосов
/ 25 ноября 2011

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

  1. Вызовите VirtualAlloc , чтобы выделить кусок памяти.
  2. Вызовите VirtualLock , чтобы заблокировать эти страницы в физической памяти.Обратите внимание, что иногда бывает сложно убедить Windows сделать это, но обычно это работает, если у вас больше ОЗУ, и вы правильно установили размер рабочего набора процесса, используя SetProcessWorkingSetSize .Обратите внимание на специальное разрешение PROCESS_SET_QUOTA для учетной записи пользователя, под которой выполняется ваш процесс .
1 голос
/ 25 ноября 2011

Вместо использования старого VirtualAlloc и блокировки страниц самостоятельно, вы можете вызвать VirtualAlloc с параметром MEM_LARGE_PAGES.Вам необходимо заранее установить некоторые настройки: См. Здесь

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

0 голосов
/ 25 ноября 2011

Одним из быстрых способов было бы отключить системную файловую систему подкачки.Вы можете создать специальную кучу для ваших данных, которая использует только физическую память, но новый / удаляющий материал, который заботится об управлении памятью для маленьких битов данных, обычно использует кучу процесса.Используйте функцию HeapCreate () из win api.Теперь вы должны получить новый / удалить, чтобы использовать эту кучу.

...