при записи содержимого в файл, потребляющего больше буфера / кеша, что приводит к зависанию системы - PullRequest
0 голосов
/ 07 августа 2020

Я пишу приложение, которое захватывает кадр с помощью v4l2 и сохраняет его на диске. Приложение должно хранить 10000 изображений.

Env: Poky (Yocto Project Reference Distro) 2.4.3 Оперативная память: 4 ГБ Дисковая память: 32 ГБ (Linux ядро ​​потребляет 900 МБ свободного места: 26,5 ГБ)

int count = 0;
unsigned char * buff = NULL;
cv::Mat matt(800, 1280, CV_8UC4);
cv::Mat mat;
while(count < 10000) {
    buff = captureFrame(); // Using V4L2 to capture frame
    memcpy(matt.data, buff, 1280*800*4);
    cv::cvtColor(matt, mat, cv::COLOR_BGRA2BGR);
    sprintf(file_name, "./camera_images_data/frame%d.bmp", count);
    cv::imwrite(file_name, mat);
    count++;
}

Если я закомментирую cv :: imwrite (file_name, mat) ; Buff / cache будет только 50 МБ во время выполнения, иначе buff / cache увеличивается, когда он достигает 650 МБ, система зависает

Вывод команды 'free -h' во время работы приложения

Любые предложения или решения будут полезны, заранее спасибо.

РЕДАКТИРОВАТЬ: Я попытался записать двоичный файл вместо bmp, чтобы я мог позже преобразовать его в bmp, но при записи в двоичный файл также увеличивался буфер / кеш и система зависала.

int count = 0;
unsigned char * buff = NULL;
cv::Mat matt(800, 1280, CV_8UC4);
cv::Mat mat;
while(count < 10000) {
    buff = captureFrame(); // Using V4L2 to capture frame
    memcpy(matt.data, buff, 1280*800*4);
    cv::cvtColor(matt, mat, cv::COLOR_BGRA2BGR);
    sprintf(file_name, "./camera_images_data/frame%d.bmp", count);

    std::ofstream fout(file_name, std::ios::binary);

    int type = mat[i].type();
    fout.write((const char*)(&mat[i].rows), sizeof(int));
    fout.write((const char*)(&mat[i].cols), sizeof(int));
    fout.write((const char*)(&type), sizeof(int));
    fout.write((const char*)(mat[i].data), mat[i].elemSize() * mat[i].total());

    fout.flush();
    fout.close();
    
    count++;
}
...