我正在编写一个程序,涉及分析最小 0.5GB(最大超过 20GB)的 CSV 文件,我使用 fstream
、while (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 毫秒非常高,改进它应该不难,除非您使用的是一些严重过时的硬件。
升级硬件。 SSD、RAID strip 化和 PCI express 硬盘专为此类事件而设计。
一次读取较大块的文件,减少 I/O 等待时间。或许首先使用 fread 将大块转储到内存。
考虑使用 mmap 在硬盘和内存之间映射一个指针。
最重要的是分析您的代码以查看延迟所在。这对于 I/O 事件来说是出了名的困难,因为它因机器而异,而且在运行时通常会有很大差异。
您可以尝试添加多线程解析,但我强烈建议您将此作为最后的手段来尝试,并了解这可能会带来很多痛苦。
关于c++ - I/O 约束性能 - 加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27618032/