gpt4 book ai didi

c# - LINQ to SQL 内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:29 25 4
gpt4 key购买 nike

我有一个程序将从数据库中读取 100 万条记录,并在经过一些处理后将这些记录插入到另一个表中。因此,程序调用 DAO API 获取 100 万条记录并在内存中循环遍历它们。插入也使用 DAO API 来进行插入。每个 DAO API 部分都实现为

    public static void Main(string[] args)
{
List<TableA> tableAs = GetTableAs();
TableB tableB = null;
foreach (var tableA in tableAs) {
tableB.id = tableA.id;
// ...
// here I copy/modify records from table A
// ...
InsertTableB(tableB);
}
}

public static List<TableA> GetTableAs()
{
using (var ctx = new TableDataContext())
{
var entities = from e in ctx.tableAs
select e;
return new List<tableA>(entities);
}
}

public static void InsertTableB(TableB tableB)
{
using (var ctx = new TableDataContext())
{
ctx.tableBs.InsertOnSubmit(tableB);
ctx.SubmitChanges();
}
}

我的程序在 500k 插入后会出现“Out of memory”异常并且非常一致。而且我注意到循环时内存使用量不断增加。我什至强制垃圾收集也无法回收任何内存。我与 LINQ 的交互是否有任何问题导致内存滞留而不被释放。任何帮助将不胜感激。

最佳答案

首先,我认为你应该重新考虑你编写代码的方式,现在它的效率低得离谱,例如你每次都重新创建上下文,为什么不只保留一个上下文?

最好将其重写为单个 SQL 语句,这样可以省去所有麻烦。

重新创建上下文在 CPU 方面是非常繁重的,如果您只需要一个连接,如您在上面的示例中所示,那么多次创建它是一种资源浪费。

其次,LINQ to SQL 对您创建、编辑、修改的每个对象进行更改跟踪,因此它知道要处理哪些对象。并且可能是您内存问题的根源。

所以我建议使用 ObjectTrackingEnabled = false 看看会发生什么。

最后你想看看批量插入。

关于c# - LINQ to SQL 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com