难以将大文件读入字节数组

时间:2013-04-08 08:41:37

标签: c# filestream large-files

我有一个非常大的BMP文件,我必须立即读取,因为我需要在将其写入临时文件时反转字节。这个BMP是1.28GB,我得到了“Out of memory”错误。我无法完全读取它(使用ReadAllBytes)或将缓冲区用于二进制数组,因为我无法初始化该大小的数组。我也无法使用缓冲区将其读入List(我可以使用Reverse()),因为它已经耗尽内存。

基本上问题是,如何读取一个非常大的文件向后(即从LastByte开始到FirstByte结束),然后将其写入磁盘?

奖励:将反向文件写入磁盘时,写入最后54个字节。

3 个答案:

答案 0 :(得分:4)

由于CLR应用程序及其内部集合的隐含内存限制,无论是32还是64平台,都无法正常处理.NET中的大文件。

为此,您可以使用Memory Mapped File直接从磁盘读取文件,而无需将其加载到内存中。创建一次内存映射会将读取指针移动到文件末尾并向后读取。

希望这有帮助。

答案 1 :(得分:4)

使用StreamReader对象,您可以Seek(将“光标”放置)到任何特定字节,这样您就可以使用它反过来遍历整个文件的内容。

示例:

const int bufferSize = 1024;
string fileName = 'yourfile.txt';

StreamReader myStream = new StreamReader(fileName);
myStream.BaseStream.Seek(bufferSize, SeekOrigin.End);

char[] bytes = new char[bufferSize];
while(myStream.BaseStream.Position > 0)
{
    bytes.Initialize();
    myStream.BaseStream.Seek(bufferSize, SeekOrigin.Current);
    int bytesRead = myStream.Read(bytes, 0, bufferSize);
}

答案 2 :(得分:2)

您可以使用内存映射文件。

http://msdn.microsoft.com/en-us/library/vstudio/dd997372%28v=vs.100%29.aspx

此外,您可以使用FileStream并通过stream.Seek(xxx,SeekOrigin.Begin)(相对位置)或位置属性(绝对位置)定位必要的位置。