在C#中处理大型列表时出现OutOfMemoryException

时间:2018-02-22 22:49:18

标签: c# list file

我必须处理一些大的表格数据文件(例如:300.000行乘200列),为每个单元格创建一个数据结构。

然而,在几千次迭代中,抛出了System.OutOfMemoryException(计算机有8GB RAM)。

在我的例子中,我将每一行解析为Dictionary of List,因为我必须有列名和值,并通过创建包含这些信息的节点来处理它。

以下是代码:

// foreach record 
foreach (Dictionary<string, string> inst in c.TodasInstancias)
{
instance = null;
tmp = null;

// for each column
foreach (KeyValuePair<string, string> kv in inst)
{
    if ((tmp = this.Relations.Find(new Predicate<Relacionamento>(x => x.Target.Name == kv.Key))) != null)
   { // if this class has a relationship with other classes
       p = og.CreateUriNode(this.UriOntologiaPrefix + ":" + kv.Key);
       o = og.CreateUriNode(new Uri(tmp.CampoOrigem.Classe.Configs.Name_space + "/" + kv.Value));
       og.Assert(instancia, p, o);
   }
   else (kv.Key != c.Configs.Identificador)
   { // se for um campo comum de dados
       p = og.CreateUriNode(this.UriOntologiaPrefix + ":" + kv.Key);
       o = og.CreateLiteralNode(kv.Value);
       og.Assert(instancia, p, o);
   }
}
}

有关如何绕过此异常的任何提示?

1 个答案:

答案 0 :(得分:1)

使用queryable处理大型列表。 您可以使用Skip and Take检索批量记录,而不是所需的所有数据。 这样,您每次都会在内存中处理一个小列表。 例如:

   var count=context.entities.Count(); 

   for(i=0,i<count,i+=1000)//1000 can be any size of batch
   {
       var batch =context.entities.Skip(i).Take(1000);
       //Do Operations you need
   }