На работе у нас есть приложение для воспроизведения 2К (2048 * 1556 пикселей) последовательностей фильмов OpenEXR. Он работает хорошо ... кроме последовательностей размером более 3 ГБ (довольно часто), он должен выгружать старые кадры из памяти, несмотря на то, что все машины имеют 8-16 ГБ памяти (которая адресуется через Linux BIGMEM).
Кадры должны быть кэшированы в памяти для воспроизведения в реальном времени. Операционная система представляет собой 32-разрядный дистрибутив Fedora, созданный несколько лет назад (в обозримом будущем невозможно выполнить обновление до 64-разрядной версии). Ограничение на процесс составляет 3 ГБ на процесс.
В принципе, можно ли как-то кэшировать в памяти более 3 ГБ данных? Моя первоначальная идея заключалась в том, чтобы распределить данные между несколькими процессами, но я понятия не имею, возможно ли это ..





Как насчет создания RAM-диска и загрузки в него файла ... при условии, что RAM-диск поддерживает BIGMEM за вас.
Вы можете использовать несколько процессов: каждый процесс загружает представление файла как сегмент разделяемой памяти, а затем процесс проигрывателя сопоставляет сегменты по очереди по мере необходимости.
Одна из возможностей - использовать mmap. Вы должны отображать / отключать различные части ваших данных в одной и той же области виртуальной памяти. Вы можете отображать только один набор за раз, но до тех пор, пока имеется достаточно физической памяти, данные должны оставаться резидентными.
Я предполагаю, что вы можете изменить приложение. Если это так, то проще всего было бы запустить приложение несколько раз (один раз для каждого фрагмента видео размером 3 ГБ), чтобы каждое из них содержало фрагмент видео, и использовать другую программу для их синхронизации, чтобы каждый из них взял на себя управление буфером кадра (или другой видеовыход) в свою очередь.
Возможно, синхронизация будет немного запутанной, но ее можно упростить, если у каждого приложения есть собственный буфер кадра, а программа синхронизации указывает видеоконтроллеру на правильный буфер кадра между кадрами при переключении на следующее приложение.
Ой, какая интересная проблема :)
(РЕДАКТИРОВАТЬ: О, я только что прочитал сообщение Роба о RAM Drive ... Меня очень взволновала эта проблема ... но я хочу еще кое-что предложить, поэтому я не буду удалять)
Можно ли ...
Я предполагаю, что часть RAM-диска - вот где вся проблема, поскольку размер RAM-диска будет зависеть от ОС и файловой системы. Возможно, вам придется создать несколько RAM-дисков и заставить ваш код прыгать между ними. Или, может быть, вы могли бы настроить набор полос RAID-0 для нескольких RAM-дисков. Или, если все еще есть ограничения ОС, и вы можете позволить себе выбросить пару тысяч (4k?), Установите аппаратный набор RAID-0 с некоторыми из этих новых молниеносных быстрых твердотельных накопителей. Или же...
Веселье, веселье, веселье.
Обязательно проследите!
@dbr сказал:
There is a review machine with an absurd fiber-channel-RAID-array that can play 2K files direct from the array easily. The issue is with the artist-workstations, so it wouldn't be one 00 RAID array, it'd be hundreds..
Что ж, если вы можете принять ограничение в ~ 30 ГБ, то, может быть, одного SSD-диска на 36 ГБ будет достаточно? Я думаю, что они стоят ~ 1 тыс. Долларов каждый, и скорости передачи данных может быть достаточно. Это может быть дешевле, чем использование чистой RAM. Доступны и меньшие размеры. Если ~ 60 ГБ достаточно, вы, вероятно, могли бы уйти с массивом JBOD из 2 за удвоенную стоимость и пропустить контроллер RAID. Обязательно посмотрите на варианты SSD более высокого уровня - нижний предел заполнен прославленными картами памяти. :П
технология множественных процессов использовалась в Adobe Premiere CS4, прежде чем она перешла на 64-разрядную версию