ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

从许多文件中进行C#快速CSV读取

2019-11-05 15:07:26  阅读:517  来源: 互联网

标签:bulk csv c


我有一个包含3000个csv文件的文件夹,大小从1Kb到100kb不等.这些文件中的每一行都是43个字符长.它们的总大小为171Mb.

我正在尝试编写一个程序来尽可能快地解析这些文件.

我最初尝试自己的实现,但对这些结果不满意.然后,我在StackOverflow上找到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绑定的代码更快.唯一可能的改进是,一个线程读取文件,另一个线程进行转换,以使读取和转换重叠.有多个线程进行读取是没有意义的,它们只会轮流等待磁盘.

并注意文件系统缓存.第二次对同一文件运行测试时,将从内存而不是磁盘获取数据.速度很快,但不会告诉您它在生产中的性能.

标签:bulk,csv,c
来源: https://codeday.me/bug/20191105/1995867.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有