Как увеличить скорость записи для настройки нескольких камер? - PullRequest
0 голосов
/ 01 октября 2018

У меня есть диск с возможностью последовательной записи 1572 Мб / с

Disk sequential and Random write and read speed

У меня 4 камеры с 60 кадрами в секунду.Каждый кадр не закодирован и составляет 3,7 Мб (скажем, 4 Мб) изображения.Мне нужна скорость записи 4 * 4 * 60 = 960 Мб / с.

PointGrey предоставляет примеры с кодом:

for (unsigned int uiCamera = 0; uiCamera < numCameras; uiCamera++)
    {
        error = retrieveImage(ppCameras[uiCamera], &image);
        // error = ppCameras[uiCamera]->RetrieveBuffer(&image);
        if (error != PGRERROR_OK)
        {
            PrintError(error);
            cout << "Press Enter to exit." << endl;
            cin.ignore();
            return -1;
        }

        // Get the size of the buffer associated with the image, in bytes.
        // Returns the size of the buffer in bytes.
        iImageSize = image.GetDataSize();

        // Write to the file
        ardwBytesWritten[uiCamera] = writeFrameToFile(m_ALLCAMS, image);


};

, где:

size_t writeFrameToFile(FILE* f, Image image)
{
    return fwrite(image.GetData(),
        1,
        image.GetCols() * image.GetRows(),
        f);
}

к сожалению, я могу получить только скорость записи около 370 - 500 Мбит / с в релизережим (согласно профилировщику Windows).

writeFrameToFile - самая медленная операция, и в режиме отладки она занимает 12-13 мс.

Имеет ли смысл параллельную запись в файл, или ssd не может писать в параллельных потоках?Должен ли я использовать несколько SSD?Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Если больше ничего не работает, ваш последний вариант - обойти ОС и файловую систему путем записи непосредственно на сам диск.

В Linux вы могли бы сделать это, записав на соответствующее устройство, вероятно, где-то в/ dev / disk / by-id / ... и в Windows я даже не знаю, с чего начать, но я вполне уверен, что это возможно.

Обратите внимание, что это приведет к удалению всего, что уже есть на диске., поэтому вам нужен диск только для этой цели, и если вы случайно запишете на неправильное устройство, вы можете испортить всю установку ОС.

Так что это довольно сложный и рискованный материал, и я не знаю достаточно оэто действительно поможет, кроме как сказать, что это может стоить изучить.

0 голосов
/ 01 октября 2018

Если вы работаете в системе Linux, рассмотрите возможность сопоставления файла в памяти .

Зная заранее размер файла, вы можете указать ОС настроить явное сопоставление памяти, используяфункции как mmap().Все содержимое файла затем сопоставляется с пространством виртуальной памяти вашей программы, и запись в файл становится такой же простой, как копирование данных между двумя буферами памяти.

Конечно, весь файл не должен помещатьсяв памяти во время написания.Но в этом и заключается сила этого подхода.Позволяя ОС отображать память для вас, тот же механизм, обычно используемый для сквозного кэширования и предварительной выборки страниц, асинхронно выгружает записанные страницы в реальный файл на диске.Таким образом, ваша программа может продолжать писать, а сама ОС планирует, где и когда произойдет фактический ввод-вывод (обычно на других ядрах ЦП, без приостановки выполнения вашей программы).Кроме того, размеры блоков также выбираются ОС соответствующим образом.

TL; DR:

  • Отображение файлов обеспечивает мощный асинхронный ввод-вывод в Linux.
  • Вам не нужно беспокоиться о размерах буфера.ОС делает правильные вызовы для вас.
  • Это может быть сложнее настроить, но после этого вы можете просто элегантно записать в файл так же, как вы бы записали в буфер памяти.

Для получения дополнительной информации, проверьте страницу руководства и этот пример в Gist .

Редактировать: Из комментариевТеперь я вижу, что вы на Windows.То же самое можно сделать и с помощью CreateFileMappingA().Более подробную информацию можно найти в этой статье .

...