【发布时间】:2013-01-14 14:07:25
【问题描述】:
我正在处理大文件,从 10Gb 开始。我正在将文件的部分加载到内存中进行处理。以下代码适用于较小的文件 (700Mb)
byte[] byteArr = new byte[layerPixelCount];
using (FileStream fs = File.OpenRead(recFileName))
{
using (BinaryReader br = new BinaryReader(fs))
{
fs.Seek(offset, SeekOrigin.Begin);
for (int i = 0; i < byteArr.Length; i++)
{
byteArr[i] = (byte)(br.ReadUInt16() / 256);
}
}
}
打开一个10Gb的文件后,第一次运行这个函数就OK了。但是第二个Seek() 抛出了一个IO 异常:
An attempt was made to move the file pointer before the beginning of the file.
数字是:
fs.Length = 11998628352
偏移量 = 4252580352
byteArr.Length = 7746048
我假设 GC 在第二次调用之前没有收集关闭的 fs 引用并尝试了
GC.Collect();
GC.WaitForPendingFinalizers();
但没有运气。
感谢任何帮助
【问题讨论】:
-
您已将
offset声明为Int64或long? -
@itsme86 谢谢,这就是原因。我在这里简化了 fs.Seek 第一个参数来抵消。在我的原始代码中
fs.Seek(a*b*c, SeekOrigin.Begin);a,b,c 是整数,所以乘法的结果是负数,我没有注意到。
标签: c# large-data-volumes large-data