读取682个txt文件后,读取内存不足
本文关键字:读取 内存不足 文件 682个 txt | 更新日期: 2023-09-27 18:09:41
我想用这个代码读取一个文件,但是在682次之后我得到这个错误:
类型为"System"的异常。OutOfMemoryException'被抛出。
System.IO.StreamReader file = new System.IO.StreamReader(scanpad[lusteller]);
scanpad是一个包含文件路径的数组,lusteller是它的计数器。扫描板存在11207个文件。
我也看了看是否有一个文件在682
谁有解决方案?
这里是我的代码的完整版本
using (StreamReader file = new System.IO.StreamReader(scanpad[lusteller]))
{
//do stuff
lengte = bestandsnaam.Length;
lengte = lengte - 13;
controller = bestandsnaam.Remove(lengte, 13); // controllertype uit naam halen
do
{
rij = file.ReadLine();
if (rij != null) //error op volgende lijn vermijden
{
if (rij.StartsWith("0") || rij.StartsWith("1") || rij.StartsWith("2") || rij.StartsWith("3"))
{
rijcheck = true;
}
teller = teller + 1;
if (teller > 10)
{
if (rijcheck == true) // rij is datumlijn
{
string[] split = rij.Split(' ');
foutinformatie[0, index] = type; //type ophalen
foutinformatie[3, index] = controller; //controllernaam ophalen
foutinformatie[1, index] = split[0]; //datum ophalen
foutinformatie[2, index] = split[1]; //tijd ophalen
foutinformatie[4, index] = split[2]; //foutcode ophalen
foutinformatie[5, index] = split[5]; //foutteller ophalen
if (controller.StartsWith("MPU") == true)
{
lusarraygraad = 5;
while (lusarraygraad < 360)
{
if (graadmpu[0, lusarraygraad] == split[2])
{
try
{
graad = graadmpu[1, lusarraygraad];
foutinformatie[7, index] = graad;
}
catch
{
}
lusarraygraad = lusarraygraad + 499;
graadgevonden = true;
}
lusarraygraad = lusarraygraad + 1;
}
foutinformatie[7, index] = graad;
if (graadgevonden == false)
{
foutinformatie[7, index] = "";
}
graadgevonden = false;
}
//////////////////////////////////////////////////////////////////////////
if (controller.StartsWith("AAUX") == true)
{
lusarraygraad = 4;
while (lusarraygraad < 30)
{
if (graadaaux[0, lusarraygraad] == split[2])
{
try
{
graad = graadaaux[1, lusarraygraad].ToString();
foutinformatie[7, index] = graad;
}
catch
{
}
lusarraygraad = lusarraygraad + 499;
graadgevonden = true;
}
lusarraygraad = lusarraygraad + 1;
}
foutinformatie[7, index] = graad;
if (graadgevonden == false)
{
foutinformatie[7, index] = "";
}
graadgevonden = false;
}
if (controller.StartsWith("ACTRL") == true)
{
lusarraygraad = 6;
while (lusarraygraad < 85)
{
if (graadactrl[0, lusarraygraad] == split[2])
{
try
{
graad = graadactrl[1, lusarraygraad].ToString();
foutinformatie[7, index] = graad;
}
catch
{
}
lusarraygraad = lusarraygraad + 499;
graadgevonden = true;
}
lusarraygraad = lusarraygraad + 1;
}
foutinformatie[7, index] = graad;
if (graadgevonden == false)
{
foutinformatie[7, index] = "";
}
graadgevonden = false;
}
try
{
telleromschrijving = 6;
informatie = "";
while (split[telleromschrijving] != " ")
{
informatie = informatie + " " + split[telleromschrijving];
telleromschrijving = telleromschrijving + 1;
}
}
catch
{
foutinformatie[6, index] = informatie; //foutteller ophalen
}
rijcheck = false;
rij = file.ReadLine();
while (varcheck < 40)
{
// rij met eerste variable
if (rij != "")
{
variable[indexlokaal, varteller] = rij;
foutinformatie[varteller + 8, index] = variable[indexlokaal, varteller] = rij;
varteller = varteller + 1;
rij = file.ReadLine();
}
else
{
foutinformatie[varteller + 8, index] = " ";
varteller = varteller + 1;
}
varcheck = varcheck + 1;
}
varcheck = 0;
varteller = 0;
indexlokaal = indexlokaal + 1;
index = index + 1;
}
}
}
}
while (rij != null);
file.Close();
file.Dispose();
}
我想682只是一个刚好内存用完的数字,而不是一个特殊的数字。您应该将流式阅读器封装到
中。using(StreamReader file = new System.IO.StreamReader(scanpad[lusteller]))
{
//do stuff
}
这样,流式阅读器在使用后被处理,清除内存
EDIT FOR UPDATE
在你的流阅读器中,你也有
rij = file.ReadLine();
while (varcheck < 40)
{
// rij met eerste variable
if (rij != "")
{
variable[indexlokaal, varteller] = rij;
foutinformatie[varteller + 8, index] = variable[indexlokaal, varteller] = rij;
varteller = varteller + 1;
rij = file.ReadLine();
}
但您没有检查ReadLine
是否再次返回null,查看http://msdn.microsoft.com/en-GB/library/system.io.streamreader.readline.aspx
这也可能导致内存不足异常,因为您的流已达到空值,但您仍在继续
这完全取决于你如何使用StreamReader。
首先,您需要处理它,但我不认为这是问题,因为GC会在内存耗尽之前收集它(除非您还持有对它的引用)。
如果你使用像"ReadToEnd"这样的东西,而文件的内容很大,你就会在创建字符串时碰到大对象堆(如果你通过创建子字符串来操作它们,情况会变得更糟)。过了一段时间后,堆变得碎片化,因此您将耗尽内存,因为它无法为您的请求找到足够大的内存块。
嗯,这是我的猜测,你的代码中没有什么信息,祝你好运。
Try use Using
:(read后处置内存)
using(System.IO.StreamReader file = new System.IO.StreamReader(scanpad[lusteller]))
{
}