内存不足异常

本文关键字:异常 内存不足 | 更新日期: 2023-09-27 18:03:32

我有一个类类型的列表,它包含(string, string, string, string, int, DateTime, DateTime)字符串的总字符数等于28。

我读入一个文件来填充列表,最终列表中有19,000,000(1900万)个这样的对象。

我读取文件并像这样添加到列表中

public void ReadDocGrabValues(string fileREAD)
{
    using (var file = new StreamReader(fileREAD))
    {
        var j = file.ReadLine();
        while (j != null)
        {
            mylist.Add(new IDandAGE(j.Substring(0, 15), j.Substring(16, 1), j.Substring(18, 6), j.Substring(25, 6), 0, DateTime.Today, DateTime.Today));
            j = file.ReadLine();
        }
    }
}

这应该不是问题。然后遍历整个列表,从两个字符串中计算出DateTime对象。

public void ConvertYOBDOI()
{
    foreach (IDandAGE x in mylist)
    {
        string IssueDate = (x.StringDOD.Substring(0,4) + "-" + x.StringDOD.Substring(4,2) + "-01");
        string BirthDate = (x.StringYOB.Substring(0,4) + "-" + x.StringYOB.Substring(4,2) + "-01");
        x.DeathDate= DateTime.Parse(DeathDate);
        x.YearOfBirth = DateTime.Parse(BirthDate);
     }
}

然后再次遍历整个列表以计算出age值。

public void DateCalc()
{
    foreach (IDandAGE w in mylist)
    {
        w.Age = w.DateOfDeath.Year - w.YearOfBirth.Year;
        if (w.YearOfBirth > w.DateOfDeath.AddYears(-w.Age)) w.Age--;
    }
}

最后我从列表中写出我想要的值到一个文件。

public void CreateAgeFile()
{
   StreamWriter a = new StreamWriter(@"C:'GetAgeTest.txt");
    foreach (IDandAGE x in mylist)
    {
       String f = (x.ID + "," + x.Gender + "," + x.StringYOB + "," + x.StringDOD + "," + x.Age + ",NULL,NULL,NULL");
        a.WriteLine(f);
    }
    a.Close();
}

我真的只是刚刚开始编码,所以提前为它的效率低下/垃圾/无法回答我自己的问题道歉。

我猜它给我这个异常可能有多种原因,因为我遍历了几次列表。

欢迎任何帮助或建议。

谢谢。

内存不足异常

如果您正在访问19M条记录,那么是的:您至少需要考虑内存。您目前将它们全部存储在一个列表中,因此它们将无法收集。如果您使用的是32位(或启用64位并选中首选32位),那么这将会很紧。一个更好的主意可能是使用一个迭代器块,这样你就不需要一次把它们都放在内存中了:

public IEnumerable<IDandAGE> ReadDocGrabValues(string fileREAD)
{
    foreach(string j in File.ReadLines(fileREAD))
    {
        yield return new IDandAGE(j.Substring(0, 15), j.Substring(16, 1),
            j.Substring(18, 6), j.Substring(25, 6), 0,
            DateTime.Today, DateTime.Today);
    }
}
...
foreach (IDandAGE w in ReadDocGrabValues(path))
{
    // do per-item processing
}