gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:38:42 25 4
gpt4 key购买 nike

我需要读取和处理超过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协议(protocol)访问的网络驱动器,但文件保存在多个物理磁盘上。

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

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

最佳答案

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

你可以在那里得到更好的答案Why is .NET's File.Open with a UNC path making excessive SMB calls?

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

我发现这个很好用的库:https://github.com/i-e-b/tinyQuickIO

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

关于c# - FileStream 慢速,快速读取方式读取许多文件的几个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58764758/

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