Как оптимизировать время для записи большого количества файлов (сохранение кадров из видео) - PullRequest
3 голосов
/ 12 января 2012

Фон

В настоящее время я работаю над небольшим приложением, которое захватывает потоки карт RGB и глубины с устройства Microsoft Kinect и сохраняет их на диске для последующего анализа.Когда я запускаю программу, она выводит каждый кадр на диск как отдельный образ.

Частота кадров Kinect составляет 30 кадров в секунду, но есть два источника, поэтому сделайте это (приблизительно) 60 кадров в секунду.Если я наивно пытаюсь просто сохранить каждый кадр, когда он прибудет, я получу пропущенные кадры, как демонстрирует связанное приложение freenect / record.c .

Я переписал приложение, чтобы использовать один потокон берет кадры с устройства и помещает их в конец списка с двумя окончаниями (std::deque).Затем есть два потока, каждый из которых выталкивает кадры из передней части списка с двойным окончанием и сохраняет кадры на диск.Когда запись выключена, в списке остается потенциально большое количество кадров, которые еще нужно записать, поэтому перед выходом мы даем двум потокам сохранения выполнить свою работу до конца.

Теперь фактическийпроблема

Хотя проблема пропущенных кадров решена, запись в файловую систему все еще довольно медленная.Есть ли хороший способ ускорить создание файла на диске?В настоящее время функция dump_frame выглядит следующим образом:

static void
dump_frame(struct frame* frame)
{
    FILE* fp;
    char filename[512]; /* plenty of space! */

    sprintf(filename, "d-%f-%u.pgm", get_time, frame->timestamp);

    fp = fopen(filename, "w");
    fprintf(fp, "P5 %d %d 65535\n", frame->width, frame->height);
    fwrite(frame->data, frame->size, 1, fp);
    fclose(fp);
}

Я использую Fedora 14 x64, поэтому решение должно касаться только Linux как операционной системы.

Ответы [ 2 ]

1 голос
/ 12 января 2012

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

Когда я тестировал в своей локальной системе с OSX и твердотельным накопителем Intel X25M 2G, я заметил огромные различия в записи при записи нескольких файлов размером 1 МБ по сравнению с записью файла объемом 1 МБ. Вероятно, это связано с ведением файловой системы и зависит от вашей файловой системы.

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

Альтернатива, если у вас много памяти, - это создать оперативный диск и сначала сохранить на нем образы, а затем переместить их в постоянную файловую систему. С 6 Гб оперативной памяти вы можете хранить около 100 секунд видео.

1 голос
/ 12 января 2012

Возможное улучшение - явная установка полной буферизации fp с использованием setvbuf :

const size_t BUFFER_SIZE = 1024 * 16;
fp = fopen(filename, "w");
setvbuf(fp, 0, _IOFBF, BUFFER_SIZE)); /* Must be immediately after the open. */
fprintf(fp, "P5 %d %d 65535\n", frame->width, frame->height);
fwrite(frame->data, frame->size, 1, fp);
fclose(fp);

Вы можете профилировать, используя разные размеры буфера, чтобы определить, какая из них обеспечивает наилучшую производительность.

...