我必须处理一些大的表格数据文件(例如: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);
}
}
}
有关如何绕过此异常的任何提示?
答案 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
}