Сохранение большого количества данных без замедления потока - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно сохранить след видеосистемы для последующего повторного осмотра-воспроизведения на компьютере с Windows.

Генерация кадров выполняется в потоке, и я хочу сохранить кадры в концефункция обработки, например,

void generate_video_frame() {

    ....

    save_frame(frame);
}

Чтобы избежать замедления потока генерации save_frame, необходимо выполнить это как можно быстрее.Конечная цель - сохранить сохраненную на диске трассировку видео.

Каждый кадр может быть довольно большим (даже 20-30 МБ), поэтому я не могу просто хранить все в ОЗУ, так как в конечном итоге заполнюэто полностью.

Я думал о двух решениях:

  • Заполнение очереди фреймов и использование другого потока, чтобы очистить его и сбросить его на диск (таким образом, основной потокне пострадает).Это может в конечном итоге также заполнить оперативную память, если поток записи на диск будет медленнее (как я ожидаю)

  • Использовать сопоставленный файл и записывать каждый кадр каккак только смогу

Есть ли лучший подход?Если нет, то о каких минусах / предостережениях я должен знать?

1 Ответ

0 голосов
/ 24 мая 2018

Это зависит.Каков источник ваших кадров?Они поступают из источника в реальном времени, то есть с камеры, и затем обрабатываются каким-то образом?Или они просто генерируются из любого типа данных (и нет никакого давления в реальном времени от источника данных).

Ваш вопрос как-то предлагает последнее.Если это так, я предлагаю действительно запустить создание и запись на диск в разных потоках.На самом деле, это может быть даже больше, у вас может быть не только две задачи, но и три:

  1. Генерация данных изображения
  2. Кодирование видеоданных
  3. Записьвидеоданные на диск

Первое, похоже, не является вашим узким местом, поэтому я предлагаю запустить это и заполнить очередь до тех пор, пока вы не запустите ее выше определенного предела (чтобы избежать нехватки ОЗУ)) и просто подождите.

Вторая кодировка сжимает ваши данные за счет времени обработки.Как только изображения есть, это можно сделать независимо от поколения.Здесь есть большой выбор (от кодеков без потерь до кодеков с потерями с различными качествами), но это часто стоит делать.После этого вы можете хранить сжатые данные только в оперативной памяти, что сокращает использование оперативной памяти.С другой стороны, это, конечно, требует некоторой вычислительной мощности и (при условии, что она уже многопоточная) может замедлить создание данных.Итак, здесь вы можете сбалансировать размер данных и скорость генерации для наилучшего возможного баланса.

Наконец, запись на диск.Если вы пишете несжатые данные, это много.Если это сжато, не так сильно.Поскольку запись на диск часто бывает медленной, конечно, помогает запись меньшего количества данных.Кроме того, запись больших объемов данных более эффективна, чем запись небольших объемов данных.Поэтому сбор нескольких кадров и их одновременная запись могут сэкономить ваше время.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...