С ++ тяжелая обработка данных и подкачка - PullRequest
6 голосов
/ 10 ноября 2010

Я пишу приложение, которое должно обрабатывать большие объемы данных (от 1 до 10 ГБ) в режиме реального времени, насколько это возможно.

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

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

как определить, сколько данных нужно предварительно загрузить, чтобы сохранить сбои страницнизкий?могу ли я как-то повлиять на ОС на то, какие данные я хочу сохранить в памяти?

спасибо!

// edit: я сейчас работаю на Windows 7 64 (однако приложение 32-битное)и приложение не должно запускаться на каком-либо компьютере - только на конкретном, поскольку это исследовательский проект.

Ответы [ 3 ]

3 голосов
/ 10 ноября 2010

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

И да, в этом нет никакой магии, если вам нужны все 10G, доступные в ОЗУ, поскольку к ним обращаются одинаково часто, получите 16 ГБ ОЗУ на вашем устройстве.

2 голосов
/ 10 ноября 2010

Для платформы Windows я бы порекомендовал вам взглянуть на:

  • Функция MapViewOfFile : отображает представление файла, сопоставляемое с адресным пространством вызывающегоprocess
  • Порты завершения ввода-вывода : эффективная модель потоков для обработки нескольких асинхронных запросов ввода-вывода в многопроцессорной системе
1 голос
/ 10 ноября 2010
...