gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:46:02 26 4
gpt4 key购买 nike

我有一个包含 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 绑定(bind)代码更快。唯一可能的改进是一个线程读取文件,另一个线程进行转换,以便重叠读取和转换。让多个线程进行读取是没有意义的,它们只会轮流等待磁盘。

并注意文件系统缓存。第二次对同一个文件运行测试时,您将从内存中获取数据,而不是磁盘。这很快,但不会告诉您它将如何在生产中执行。

关于C# 从许多文件中快速读取 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4622931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com