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



我需要读取和处理超过一亿个文件,但我只需要读取每个文件的前4个字节,因为我只需要读标题
我已经创建了一个.net core 2.2批来处理它们,并且我已经使用多线程来最大限度地提高并发处理,但在我脑海中进行了所有可能的优化之后,这仍然需要太多时间
我做了评测基准测试,78%的时间用于打开文件流:file.OpenRead(filePath(。
对于比较而言,file.Exist(filePath(和Director.Exit(dirPath(要快得多
即使是我预期的Directory.GetFiles(dirPath(函数也非常慢,它只需要全局执行时间的4%。

另外15%的时间用于有效地从流中读取数据。

我从文档中了解到,默认缓冲区大小为4096字节,因此首先尝试将其减少到4字节,但性能没有显著变化,但我认为保留4096是正确的,因为它是文件系统的集群大小。

该卷是使用CIFS协议访问的网络驱动器,但文件保存在多个物理磁盘上。

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

你能建议一种更快访问所有文件的方法吗?

FileStream比其他API(如File.Exist、Directory.GetFiles等(慢,因为它执行了大量SMB调用来规范路径、要求权限等

你可以在那里得到更好的答案为什么是.NET';s文件。是否使用UNC路径打开进行过多SMB调用?

因此,加速流的最好方法是直接调用本机API来避免大多数控件。

我发现了一个运行良好的好库:https://github.com/i-e-b/tinyQuickIO

该库的唯一问题是它不针对.NET Core或.NET标准,但如果您在windows下使用它,它就可以工作。

我认为是时候进行多任务处理了免责声明:

运行控制文件的循环的另一项任务是非常标准的。如果没有别的,只是为了不锁定主/GUI线程。

但是,所有形式的多目标并不是一种神奇的"让事情变得更快"的子弹。如果你把它应用到错误的问题上,你最终得到的代码比简单的顺序代码更复杂/更容易出错,对内存的要求更高,最重要的是更慢

现在,文件处理通常是磁盘或网络绑定操作。你只得到4个字节,所以我想你没有为每个文件做很多自定义的CPU工作。因此,这里唯一的CPU工作将是打开和关闭手柄。我敢肯定,Wich几乎没有什么,除非你在磁盘/网络上使用一些像PIO这样的古董。磁盘/网络绑定也是如此。

有一些边缘案例涉及互联网连接和每次连接的限制,但我怀疑它们是否适用于此。一般来说,每个文件的多任务处理不会加快任何速度。

相关内容

  • 没有找到相关文章

最新更新