gpt4 book ai didi

c++ - 在 C++ 中快速编写许多大文件

转载 作者:行者123 更新时间:2023-11-28 02:59:34 25 4
gpt4 key购买 nike

我有一个程序可以从不同的相机获取原始数据流并将其写入磁盘。该程序运行这些类型的记录约 2 分钟,然后使用另一个程序处理帧。

每个原始帧为 2MB,帧速率为 30fps(即数据速率约为 60MB/s),我正在写入可以轻松处理持续 > 150MB/s 的 SSD(通过复制 4000 个 2MB 文件进行测试)从另一个磁盘耗时 38 秒,Process Explorer 显示持续的 IO 事件)。

我的问题是,偶尔调用 fopen()fwrite()fclose() 会停止长达 5 秒,这意味着300MB 的帧作为积压日志在内存中累积,经过几次延迟后,我达到了 32 位进程的 4GB 限制。 (发生延迟时,Process Explorer 会显示 IO 事件中的间隙)

有一个线程运行一个循环,为添加到队列中的每个新帧调用此函数:

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
}

(实际代码中也有错误检查,但对这个问题没有影响)我正在记录每个 block 所花费的时间以及运行该函数所花费的总时间,并且我得到的结果大部分时间如下所示:(以毫秒为单位的时间)

TotalT,5,       FOpenT,1,       FWriteT,2,    FCloseT,2
TotalT,4, FOpenT,1, FWriteT,1, FCloseT,2
TotalT,5, FOpenT,1, FWriteT,2, FCloseT,2

即。 ~5ms 运行所有函数,~1ms 打开文件,~2ms 调用写入,~2ms 关闭文件。

但有时(平均每 50 帧大约有 1 帧,但有时在出现此问题之间可能有数千帧),我得到的帧超过 4000 毫秒:

TotalT,4032,    FOpenT,4023,    FWriteT,6,    FCloseT,3

TotalT,1533,    FOpenT,1,       FWriteT,2,    FCloseT,1530

所有的帧都是相同的大小,它永远不会 fwrite 花费额外的时间,总是 fopenfclose

没有其他进程正在读取/写入此 SSD(已通过 Process Monitor 确认)。

有谁知道可能导致此问题的原因和/或避免/缓解此问题的任何方法?

最佳答案

我会支持 X.J.,您可能在一个目录中写入了太多文件。一种解决方案是为每批帧创建一个新目录。还可以考虑在创建文件后直接调用 SetEndOfFile,因为这将有助于 Windows 在单个操作中分配足够的空间。

FAT 不是真正的解决方案,因为它在大型目录上的表现更差。

关于c++ - 在 C++ 中快速编写许多大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176048/

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