System.IO.File.ReadAllBytes 用于大于 2GB 的文件

Posted

技术标签:

【中文标题】System.IO.File.ReadAllBytes 用于大于 2GB 的文件【英文标题】:System.IO.File.ReadAllBytes for file larger than 2GB 【发布时间】:2014-11-12 08:06:14 【问题描述】:

我有一个大文件,我需要将其复制到内存中以进行进一步处理。该软件适用于小于 2GB 的文件,但一旦它们超过此限制,我就会得到一个异常,即 ReadAllBytes 仅支持小于 2GB 的文件。

byte[] buffer = System.IO.File.ReadAllBytes(file); // exception if file > 2GB

将大于 2GB 的文件复制到内存的最快方法是什么?

进程已经是 64 位,并且标志 gcAllowVeryLargeObjects 已经设置。

【问题讨论】:

您可以增加最大值:msdn.microsoft.com/en-us/library/hh285054.aspx 但问题是:为什么需要一次将所有内容加载到内存中?使用基于流的方法。 分块读取并处理?或者让你的进程 64 位? @Tim 和 Soner,我想如果进程是 32 位,仅此还不够。 @SriramSakthivel:你说得对,第一句话就提到了。但无论如何我都不会全部加载到内存中。 你想用这个文件做什么?我很确定您可以使用类似流的解决方案来实现这一点。或逐行阅读,如果您提供更多信息,我们可以帮助您找到基于流的解决方案,它的性能也会更高 【参考方案1】:

我怀疑你能比内存映射文件http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile(v=vs.110).aspx 更快地做任何事情。

using ( var file = MemoryMappedFile.CreateFromFile( "F:\\VeryLargeFile.data" ) )


然后您可以使用 CreateViewAccessor 或 CreateViewStream 来操作数据。

【讨论】:

以上是关于System.IO.File.ReadAllBytes 用于大于 2GB 的文件的主要内容,如果未能解决你的问题,请参考以下文章