Я прочитал немало сообщений SO и общих статей о попытке выделить более 1 ГБ памяти, поэтому перед тем, как сбить, как и другие, вот какой-то контекст.Память сопоставленных файлов, которые смежны на диске
Это приложение будет работать как киоск с выделенной машиной без ненужных процессов.
Мое приложение приобретает изображения с высокоскоростной камеры с рулоном затвором со скоростью 120 кадров в секунду с разрешением 1920 x 1080 с глубиной в 24 единицы. Приложение должно записывать каждый отдельный кадр на диск для последующей обработки. Текущая проблема, с которой я сталкиваюсь, заключается в том, что дисковый ввод-вывод не будет поддерживать скорость захвата, даже если он ограничен 120 кадрами в секунду. Необходимая ширина дискового ввода-вывода составляет около 750 Мбит/с!
Общая длина записи должна быть не менее 10 секунд (7,5 ГБ) в необработанном виде. Выполнение любого транскодирования или сжатия «на лету» приводит к снижению частоты кадров до совершенно неприемлемых уровней.
Чтобы обойти эту проблему, я попытался следующие:
- Компромат на качество за счет уменьшения битовой глубины на аппаратном уровне до 16, которые до сих пор вокруг 500Mbps.
- Отключено все кодирование изображения и запись необработанных данных камеры на диск. Это сэкономило время обработки.
- Создание одного файла объемом 10 ГБ на диске и выполнение последовательной записи в виде фреймов. Это помогло до сих пор. Для всех приложений и систем производства имеется специальный накопитель на 100 ГБ для этого приложения.
- Использование Contig.exe из Sysinternals для дефрагментации файла. Это привело к поразительным успехам на дисках, отличных от SSD.
Невозможно изучить здесь. Я не знаком с файлами с отображением памяти и при попытке их создания получаю сообщение об ошибке IOException Not enough storage is available to process this command.
.
using (var file = MemoryMappedFile.CreateFromFile(@"D:\Temp.VideoCache", FileMode.OpenOrCreate, "MyMapName", int.MaxValue, MemoryMappedFileAccess.CopyOnWrite))
{
...
}
Этот большой файл, который я использую в настоящее время, требует либо последовательного доступа к записи, либо доступа к последовательному доступу. Любые указатели будут оценены.
Я мог бы даже заставить общий размер записи до 1,8 ГБ, если только был способ выделить столько ОЗУ. Еще раз, это будет работать на выделенном 8 ГБ доступной памяти и 100 ГБ свободного места. Однако не все производственные системы будут иметь накопители SSD.
Очевидно, что производственной системе нужен либо диск, который может обрабатывать пропускную способность, либо достаточно памяти для хранения переполнения в памяти, ожидая, когда диск обработает нагрузку? Разве это не все, что нужно? Если вы не пишете свою собственную файловую систему или не говорите изначально в NTFS или в конкретной файловой системе, нет простого способа гарантировать непрерывный файл. –
Что вы думаете? – CodeCaster
Вы, конечно, можете выделить столько (1,8 ГБ) ОЗУ. 64-битные процессы и функции выделения Win32 (на машине с достаточным объемом оперативной памяти). Но в конце вам нужна дисковая система с достаточной производительностью. – Richard