我有一个包含3000个csv文件的文件夹,大小从1Kb到100kb不等.这些文件中的每一行都是43个字符长.它们的总大小为171Mb.
我正在尝试编写一个程序来尽可能快地解析这些文件.
我最初尝试自己的实现,但对这些结果不满意.然后,我在*上找到LumenWorks.Framework.IO.Csv.它有大胆的主张:
To give more down-to-earth numbers, with a 45 MB CSV file containing 145 fields and 50,000 records, the reader was processing about 30 MB/sec. So all in all, it took 1.5 seconds! The machine specs were P4 3.0 GHz, 1024 MB.
我简直无法获得那些结果.我的过程需要>>> 10分钟.这是因为它不是一个大数据流,而是许多小文件,并且那里有开销?我还有什么可以做的吗?
我觉得LumenWorks的实现并不比我自己的实现快(我还没有进行基准测试),更不用说它可以处理引号,转义,注释和多行字段,而我不需要这些.我有一个非常常规的逗号分隔整数格式.
干杯
解决方法:
CSV文件解析受I / O限制,取决于您从磁盘读取数据的速度.对于消费者级别的硬盘,最快可能达到每秒50到60 MB.听起来LumenWorks接近极限.
尽管在具有一个大文件的干净整洁的磁盘上,您将永远只有这种吞吐量.因此,磁盘读取器磁头只是在泵送数据而不必进行很多移动,而只是逐轨移动.移动磁头是最慢的部分,通常平均大约16毫秒.
当您读取3000个文件时,头部会有很多运动.仅打开文件大约需要50毫秒.至少进行类似测试以找出瓶颈.使用一个好的文本编辑器,然后复制/粘贴一个大文件.首先运行磁盘碎片整理程序,Defraggler是一个不错的免费软件.
至于代码改进,请注意字符串.它们会产生大量垃圾,并且CPU缓存局部性较差.线程不能使I / O绑定的代码更快.唯一可能的改进是,一个线程读取文件,另一个线程进行转换,以使读取和转换重叠.有多个线程进行读取是没有意义的,它们只会轮流等待磁盘.
并注意文件系统缓存.第二次对同一文件运行测试时,将从内存而不是磁盘获取数据.速度很快,但不会告诉您它在生产中的性能.