我需要读取和处理超过1亿个文件,但是我只需要读取每个文件头的前4个字节,因为我只需要读取标题。我已经创建了一个.net core 2.2批处理文件来处理它们,并且已经使用多线程来最大化并发处理,但是在我想到所有可能的优化之后,仍然需要花费很多时间。我进行了基准测试,并且有78%的时间用于打开文件流:File.OpenRead(filePath)。为了进行比较,File.Exist(filePath)和Director.Exist(dirPath)更快。即使是我期望非常慢的函数Directory.GetFiles(dirPath),它也仅占用全局执行时间的4%。
另外还有15%的时间用于有效地从流中读取数据。
我从文档中了解到默认缓冲区大小为4096字节,因此首先尝试减小为4字节,但是性能没有明显变化,但是我认为保留4096是正确的,因为这是文件的簇大小系统。
该驱动器是通过CIFS协议访问的网络驱动器。
为什么只打开流这么慢?也许是因为它需要检查用户权限?
您能建议一种最快的方法来访问所有文件吗?
我认为现在是我的多任务免责声明的时候了:
运行循环遍历文件的另一种替代任务是非常标准的。如果没有别的,就是不要锁定主/ GUI线程。
但是各种形式的多任务处理并不是神奇的“使事情更快”的项目符号。如果将其应用于错误的问题,最终将导致代码变得更加复杂/更容易出错,对内存的要求更高,最重要的是,先是简单的顺序代码,然后是[[slower。
现在文件处理通常是磁盘或网络绑定操作。您只能得到4个字节,所以我想您没有为每个文件执行很多自定义CPU工作。因此,这里唯一的CPU工作就是手柄的打开和关闭。我很确定也是磁盘/网络绑定的。[在少数情况下,互联网连接和每个连接的限制,但我怀疑它们是否适用于此。通常,每个文件的多任务处理并不能加快速度。