【发布时间】:2019-11-08 10:27:15
【问题描述】:
我需要读取和处理超过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 协议访问的网络驱动器,但文件保存在多个物理磁盘上。
为什么只打开流就这么慢?可能是因为它需要检查用户权限?
您能否建议一种更快的方法来访问所有文件?
【问题讨论】:
-
可能原因与此有关:stackoverflow.com/a/27265510/5081328
标签: c# .net-core io batch-processing filestream