gpt4 book ai didi

c++ - 如何提高多相机设置的写入速度?

转载 作者:行者123 更新时间:2023-11-28 04:32:11 24 4
gpt4 key购买 nike

我有一个顺序写入能力为 1572 Mb/秒的磁盘

Disk sequential and Random write and read speed

我有 4 个 60 fps 的相机。每帧未编码,是 3.7 Mb(假设为 4 Mb)图像。我需要的写入速度是 4*4*60 = 960 Mb/s。

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);
}

不幸的是,我在 Release模式下只能获得大约 370 - 500 Mb/s 的写入速度(根据 Windows Profiler)。

writeFrameToFile 是最慢的操作,在 Debug模式下需要 12-13 毫秒。

并行文件写入是否有意义,或者 ssd 不能在并行线程中写入?我应该使用多个 SSD 吗?谢谢。

最佳答案

如果您使用的是 Linux 系统,请考虑将文件映射到内存

事先知道文件大小,您可以指示操作系统使用 mmap() 等函数设置显式内存映射。然后文件的全部内容被映射到程序的虚拟内存空间,写入文件变得像在两个内存缓冲区之间复制数据一样简单。

当然,在写入过程中,整个文件不需要都放在内存中。但是,这就是这种方法的力量。通过让操作系统为您映射内存,通常用于直写缓存和页面预取的相同机制将写入的页面异步转储到磁盘上的实际文件。这样,您的程序可以继续编写,并且操作系统本身会安排实际 I/O 发生的位置/时间(通常在其他 CPU 内核上,而不会暂停您的程序的执行)。此外,操作系统也会适本地选择 block 大小。

长话短说:

  • 文件映射为您在 Linux 上提供了强大的异步 I/O。
  • 您无需担心缓冲区大小。操作系统为您做出正确的调用。
  • 设置起来可能更复杂,但一旦完成,您就可以像写入内存缓冲区一样优雅地写入文件。

有关更多信息,请查看 the manual pagethis example on Gist .

编辑:从评论中,我现在看到您使用的是 Windows。使用 CreateFileMappingA() 也可以在那里完成同样的事情.更多信息可以在 this article 中找到.

关于c++ - 如何提高多相机设置的写入速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52592073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com