У меня есть программа, которая получает поток необработанных данных с разных камер и записывает их на диск. Программа запускает такие записи в течение ~ 2 минут, а затем для обработки кадров используется другая программа.
Размер каждого необработанного кадра составляет 2 МБ, а частота кадров — 30 кадров в секунду (т. е. скорость передачи данных составляет около 60 МБ/с), и я пишу на SSD, который может легко обрабатывать устойчивые > 150 МБ/с (проверено путем копирования 4000 файлов размером 2 МБ с другого диска). что заняло 38 секунд, а Process Explorer показывает постоянную активность ввода-вывода).
Моя проблема заключается в том, что иногда вызовы fopen()
, fwrite()
и fclose()
останавливаются на срок до 5 секунд, что означает, что 300 МБ кадров накапливаются в памяти в виде невыполненного журнала, и после нескольких таких задержек я достиг предела 4 ГБ для 32-битного процесса. . (Когда происходит задержка, Process Explorer показывает пробел в активности ввода-вывода)
Существует поток, который запускает цикл, вызывающий эту функцию для каждого нового кадра, добавляемого в очередь:
writeFrame(char* data, size_t dataSize, char* filepath)
{
// Time block 2
FILE* pFile = NULL;
fopen(&pFile, filepath, "wb");
// End Time block 2
// Time block 3
fwrite(data,1,dataSize,pFile);
// End Time block 3
// Time block 4
fclose(pFile);
// End Time block 4
}
(В реальном коде также есть проверка ошибок, но это не имеет значения для этой проблемы) Я регистрирую время, необходимое для каждого из блоков, и общее время, необходимое для запуска функции, и я получаю результаты, которые большую часть времени выглядеть так: (количество раз в мс)
TotalT,5, FOpenT,1, FWriteT,2, FCloseT,2
TotalT,4, FOpenT,1, FWriteT,1, FCloseT,2
TotalT,5, FOpenT,1, FWriteT,2, FCloseT,2
т.е. ~5 мс для запуска всех функций, ~1 мс для открытия файла, ~2 мс для вызова записи и ~2 мс для закрытия файла.
Однако иногда (в среднем примерно 1 из каждых 50 кадров, но иногда между возникновением этой проблемы могут быть тысячи кадров) я получаю кадры, которые занимают более 4000 мс:
TotalT,4032, FOpenT,4023, FWriteT,6, FCloseT,3
и
TotalT,1533, FOpenT,1, FWriteT,2, FCloseT,1530
Все кадры имеют одинаковый размер, и никогда не fwrite
требуется дополнительное время, всегда fopen
или fclose
Ни один другой процесс не выполняет чтение/запись на/с этого SSD (подтверждено с помощью Process Monitor).
Кто-нибудь знает, что может быть причиной этой проблемы и / или какой-либо способ избежать / смягчить эту проблему?
fopen
иfclose
на самом деле успешно открываются и закрываются, также проверьте, сколько потоков запущено, возможно, вы достигли максимального количества потоков. - person Matthew Pigram   schedule 17.01.2014