Какой метод выделения использовать для приложения регистратора большого объема?

Я разрабатываю регистратор/сниффер с использованием Delphi. Во время работы я получаю огромные объемы данных, которые могут накапливаться во время стрессовых операций до 3 ГБ данных. На некоторых компьютерах, когда мы добираемся до этих уровней, приложение перестает работать и иногда выдает исключения.

В настоящее время я использую функцию GetMem для выделения указателя на каждое сообщение.

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

Что вы думаете об использовании HeapAlloc, VirtualAlloc или даже сопоставленных файлов? Что было бы лучше?

Спасибо.


person Ran    schedule 12.09.2011    source источник
comment
Можно ли использовать существующий регистратор большого объема, например Flume?   -  person Barend    schedule 12.09.2011
comment
выделить меньше памяти или перейти на 64-битную версию delphi   -  person David Heffernan    schedule 12.09.2011
comment
@Barend это внутренний регистратор в реальном времени, который получает информацию обо всех наших процессах + данные USB (моя компания работает с мобильными телефонами, и во время связи все пакеты USB добавляются в регистратор). Я не думаю, что готовый регистратор сможет справиться с этим правильно.   -  person Ran    schedule 12.09.2011
comment
@David, почему мне поможет переход на 64-битную версию Delphi?   -  person Ran    schedule 12.09.2011
comment
Я думаю, у вас заканчивается адресное пространство, а не память. Смена аллокаторов не сильно поможет. Вы ничего не можете сделать с ограничением адресного пространства в 4 ГБ в 32-битных окнах.   -  person David Heffernan    schedule 12.09.2011


Ответы (1)


Ваша фундаментальная проблема - ограничение жесткого адресного пространства в 4 ГБ для 32-битных процессов. Поскольку у вас возникают проблемы с 3 ГБ, я могу только предположить, что вы используете /LARGEADDRESSAWARE, работающий в 64-разрядной или 32-разрядной Windows с переключателем загрузки / 3GB.

Я думаю, у вас есть несколько вариантов, включая, помимо прочего, следующие:

  1. Используйте меньше памяти. Возможно, вы можете обрабатывать более мелкие фрагменты или переместить часть памяти на диск.
  2. Используйте 64-битную версию Delphi (только что выпущенную) или FreePascal. Это освобождает вас от ограничения адресного пространства, но ограничивает вас 64-разрядными версиями Windows.
  3. Используйте файлы с отображением памяти. На машине с большим объемом памяти это способ получить доступ к кешу памяти ОС. Файлы с отображением памяти не для слабонервных.

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

Использование другого распределителя, скорее всего, мало что изменит. Да, это правда, что есть распределители с низкой фрагментацией, но они, безусловно, не решат вашу проблему. Все, что они могли бы сделать, это немного уменьшить вероятность его возникновения.

person David Heffernan    schedule 12.09.2011
comment
Файлы с отображением памяти могут быть одним из способов продвижения вперед, но в конечном итоге вы можете выделить максимально возможное количество. И у вас будут сложные сопоставления для › 3Gb. Мне кажется, что лучшим вариантом было бы токенизировать сообщения журнала, чтобы уменьшить потребность в памяти. Таким образом, у вас может быть ошибка, запуск и открытие, уменьшенные до одного байта - может потребоваться некоторый статический анализ, чтобы определить, что является общим, но это может быстро сократить вдвое требования. - person mj2008; 12.09.2011