我检查了其他帖子,但没有找到解决此问题的方法。
dput(xts)
structure(numeric(0), index = structure(c(1293753600, 1294012800,
1294099200, 1294185600, 1294272000, 1294358400), tzone = "UTC", tclass = "Date"), class = c("xts",
"zoo"), .indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC")
dput(dt)
structure(c(17351L, 17452L, 17535L, 17585L, 17634L), class = "Date")
我试图从两个不同的文件中读取。从9.52KB的文件读取时没有问题,但是当我尝试从1.00MB的文件中读取时,我得到了OutOfMemory异常。
如果有帮助,这里是ReadBytes();我用过的功能
public string Profile(string FileName,byte[] Search, uint align)
{
string Result = "";
Stream fs = File.OpenRead(FileName);
byte[] _Search = new byte[Search.Length];
uint check = 0;
byte Check_Zero;
for (uint i = 0; i < fs.Length; i++)
{
_Search = func.ReadBytes(FileName, i, _Search.Length);
if (func.ByteArrayCompare(_Search, Search))
{
check = i + align;
break;
}
}
for (uint i = 0; i < 50; i++)
{
Check_Zero = func.ReadByte(FileName, check);
if (Check_Zero == 0)
check++;
else
{
Result = func.ReadString(FileName, check);
break;
}
}
return Result;
}
答案 0 :(得分:4)
问题是由ReadBytes
实施引起的。对于1MB文件,它被称为1 000 000次,并且每次打开文件并且不会关闭文件,因此您正在泄漏unmanaged handles。 File.OpenRead
会返回一个非常特殊的流,即FileStream
,必须明确处理,以防止泄漏。
解决这个问题的一种方法是使用静态方法File.ReadAllBytes
。在这种情况下无需处置任何东西。
更好的方法是打开文件一次,然后将FileStream引用传递到ReadBytes
函数而不是filename
。不要忘记最后明确处理它。例如,使用using
语句。这样你就会发现你的ReadBytes
函数现在是一行而且非常简单,所以你不需要这个函数,你的代码变得更快更容易。