FileStream慢,快速方式读取读取许多文件的几个字节

问题描述 投票:2回答:1

我需要读取和处理超过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协议访问的网络驱动器。

为什么只打开流这么慢?也许是因为它需要检查用户权限?

您能建议一种最快的方法来访问所有文件吗?

c# .net-core io batch-processing filestream
1个回答
0
投票

我认为现在是我的多任务免责声明的时候了:

运行循环遍历文件的另一种替代任务是非常标准的。如果没有别的,就是不要锁定主/ GUI线程。

但是各种形式的多任务处理并不是神奇的“使事情更快”的项目符号。如果将其应用于错误的问题,最终将导致代码变得更加复杂/更容易出错,对内存的要求更高,最重要的是,先是简单的顺序代码,然后是[[slower。

现在文件处理通常是磁盘或网络绑定操作。您只能得到4个字节,所以我想您没有为每个文件执行很多自定义CPU工作。因此,这里唯一的CPU工作就是手柄的打开和关闭。我很确定也是磁盘/网络绑定的。

[在少数情况下,互联网连接和每个连接的限制,但我怀疑它们是否适用于此。通常,每个文件的多任务处理并不能加快速度。

© www.soinside.com 2019 - 2024. All rights reserved.