c++ - I/O 约束性能 - 加速?

标签 c++ multithreading performance io pipeline

我正在编写一个程序,涉及分析最小 0.5GB(最大超过 20GB)的 CSV 文件,我使用 fstreamwhile (getline( fin,line)) {},并在每个逗号分隔的记录上平均花费 17 毫秒。简单的东西。

但是,有很多记录。很明显,该程序是 I/O 绑定(bind)的,但我想知道我是否可以提高 I/O 性能。我不能求助于 OpenMP,因为我会处理 CPU 限制,缓冲这么大的文件也不起作用。所以我可能需要某种管道...

我在 C++ 多线程方面的经验非常少,也从未使用过数据流框架。谁能指出我正确的方向?


更新(12/23/14):

感谢您的所有评论。你是对的,17 毫秒有点多......在做了很多分析(哦,痛苦)之后,我将瓶颈隔离为对每条记录(75 个字符)中的子字符串的迭代。我对 #pragmas 进行了试验,但它的并行化工作量还不够。函数调用的开销是主要的提示 - 现在每条记录 5.41μs,已经移动了一个大块。它很丑,但速度更快。

感谢@ChrisWard1000 的建议。不幸的是,我目前无法控制我正在使用的硬件,但会使用更大的数据集(>20GB CSV)进行分析,看看我如何引入 mmap/多线程解析等。

最佳答案

每条记录 17 毫秒非常高,改进它应该不难,除非您使用的是一些严重过时的硬件。

  1. 升级硬件。 SSD、RAID strip 化和 PCI express 硬盘专为此类事件而设计。

  2. 一次读取较大块的文件,减少 I/O 等待时间。或许首先使用 fread 将大块转储到内存。

  3. 考虑使用 mmap 在硬盘和内存之间映射一个指针。

  4. 最重要的是分析您的代码以查看延迟所在。这对于 I/O 事件来说是出了名的困难,因为它因机器而异,而且在运行时通常会有很大差异。

  5. 您可以尝试添加多线程解析,但我强烈建议您将此作为最后的手段来尝试,并了解这可能会带来很多痛苦。

关于c++ - I/O 约束性能 - 加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27618032/

相关文章:

c++ - C++ 中的单向链表

c++ - MapViewOFFIleEx 的 MSVS 链接错误

c++ - 使用 C++ 的神经网络中的单个神经元

c# - 在类之间发送值的正确方法

c# - 中止对非托管 DLL 的调用

c++ - 从 VS2003 到 VS2005 的转换问题?

c# - IIS 中创建的线程能否通知其超时?

javascript - 什么对性能更好 : Update specific cells or replace entire table?

performance - Powershell 脚本的速度。寻求优化

c# - 静态字符串中的属性 Length 是在运行时还是在编译期间计算的?