Pid*_*AWK 2 c++ io performance multithreading pipeline
我正在写,涉及到最小0.5GB(和最高达20GB)的分析CSV文件的程序,我从CSV读取与如下fstream,while (getline(fin,line)) {}和做17millisecs平均每个逗号分隔的记录工作.简单的东西.
但是,有很多记录.显然,该程序受I/O限制,但我想知道是否可以提高I/O性能.我无法使用OpenMP,因为我会处理CPU约束,而缓冲这个大的文件也不会工作.所以我可能需要某种管道......
我在C++中的多线程方面经验很少,从未使用过数据流框架.有人能指出我正确的方向吗?
更新(2014年12月23日):
谢谢你们的评论.你是对的,17ms有点多......在做了大量的分析(哦,痛苦)之后,我把瓶颈分离为每个记录中一个子串的迭代(75个字符).我试验过,#pragmas但它并不足以并行化.函数调用的开销是主要的抱怨 - 现在每条记录5.41μs,已经移动了一个大块.它很难看,但速度更快.
感谢@ChrisWard1000的建议.不幸的是,我对目前使用的硬件没有多少控制权,但是会使用更大的数据集(> 20GB CSV)进行分析,看看我如何引入mmap /多线程解析等.
每条记录17毫秒是非常高的,除非你使用一些严重过时的硬件,否则应该不难改进.
升级硬件.SSD,RAID条带化和PCI Express硬盘专为此类活动而设计.
一次读取更大块的文件,减少I/O等待时间.也许首先使用fread将大块转储到内存中.
考虑使用mmap映射硬盘和内存之间的指针.
最重要的是,您可以对代码进行分析,以查看延迟的位置.对于I/O活动而言,这是非常困难的,因为它在计算机之间有所不同,并且在运行时通常会有很大差异.
您可以尝试添加多线程解析,但我强烈建议您尝试将此作为最后的手段,并了解它可能会导致许多痛苦和痛苦.