gpt4 book ai didi

c++ - 在 C++ 中提高/优化文件写入速度

转载 作者:可可西里 更新时间:2023-11-01 15:46:36 27 4
gpt4 key购买 nike

我在写入文件时遇到了一些问题 - 即写入速度不够快。

解释一下,我的目标是捕获通过千兆以太网传入的数据流,并将其简单地保存到一个文件中。

原始数据以 10MS/s 的速率传入,然后保存到缓冲区并随后写入文件。

下面是相关的代码部分:

    std::string path = "Stream/raw.dat";
ofstream outFile(path, ios::out | ios::app| ios::binary);

if(outFile.is_open())
cout << "Yes" << endl;

while(1)
{
rxSamples = rxStream->recv(&rxBuffer[0], rxBuffer.size(), metaData);
switch(metaData.error_code)
{

//Irrelevant error checking...

//Write data to a file
std::copy(begin(rxBuffer), end(rxBuffer), std::ostream_iterator<complex<float>>(outFile));
}
}

我遇到的问题是将示例写入文件所花费的时间太长。大约一秒钟后,发送样本的设备报告其缓冲区已溢出。在对代码进行一些快速分析后,几乎所有的执行时间都花在了 std::copy(...) 上(准确地说是 99.96% 的时间)。如果我删除这一行,我可以运行程序几个小时而不会遇到任何溢出。

也就是说,我对如何提高写入速度感到很困惑。我浏览了该网站上的几篇文章,似乎最常见的建议(关于速度)是像我已经完成的那样实现文件写入 - 通过使用 std::copy

如果有帮助,我正在 Ubuntu x86_64 上运行这个程序。如有任何建议,我们将不胜感激。

最佳答案

所以这里的主要问题是你试图在接收的同一个线程中写入,这意味着你的recv()只能在复制完成后再次调用。一些观察:

  • 将写作移到另一个线程。这是关于 USRP 的,因此 GNU Radio 可能真的是您选择的工具 -- 它本质上是多线程的。
  • 您的输出迭代器可能不是最高效的解决方案。简单地向文件描述符“write()”可能会更好,但这是由您决定的性能测量
  • 如果您的硬盘驱动器/文件系统/操作系统/CPU 达不到来自 USRP 的速率,即使将接收与线程写入分离,那么您也无能为力 - 获得更快的系统。
  • 尝试写入 RAM 磁盘

事实上,我不知道您是如何想出std::copy 方法的。 rx_samples_to_file example that comes with UHD用一个简单的写来做到这一点,你绝对应该喜欢它而不是复制;在良好的操作系统上,文件 I/O 通常可以少一个拷贝来完成,并且遍历所有元素可能非常慢。

关于c++ - 在 C++ 中提高/优化文件写入速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31838749/

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