Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何释放内存?_Vb.net_Entity Framework_Garbage Collection_Enumerable - Fatal编程技术网

Vb.net 如何释放内存?

Vb.net 如何释放内存?,vb.net,entity-framework,garbage-collection,enumerable,Vb.net,Entity Framework,Garbage Collection,Enumerable,我有下面的方法在表中循环,在每一行中更改一些值,并将更改保存回数据库。为了加快速度,我正在获取10000行的数据集。这是一个包含超过2500万条记录的大表 问题是我的应用程序似乎没有释放任何内存。我尝试过将records变量重新定义为nothing,或者显式地调整垃圾收集器,但内存仍然存在。 运行内置的VS10探查器时,我可以看到罪魁祸首是system.linq.enumerable.tolist方法,它占用了我98%的内存。调用saveChanges后如何释放内存 也许你可以试试这个:我没有测

我有下面的方法在表中循环,在每一行中更改一些值,并将更改保存回数据库。为了加快速度,我正在获取10000行的数据集。这是一个包含超过2500万条记录的大表

问题是我的应用程序似乎没有释放任何内存。我尝试过将records变量重新定义为nothing,或者显式地调整垃圾收集器,但内存仍然存在。 运行内置的VS10探查器时,我可以看到罪魁祸首是system.linq.enumerable.tolist方法,它占用了我98%的内存。调用saveChanges后如何释放内存


也许你可以试试这个:我没有测试它

db.SaveChanges()
For Each record In records
    record.dispose ''only if class table got a dispose method
Next
records.clear
records = Nothing

我决不是Linq to SQL专家,但我的猜测是DataContext会缓存您已读取的所有行,因此您必须清空缓存或丢失对DataContext的引用。

存储库保留对其跟踪的每个实体的引用,因此在存储库处于活动状态并跟踪它时,您将无法处置实体。这意味着您要么需要处置存储库,要么在完成处理后分离每个实体

选项1如果Dosomework不影响返回记录的顺序,则可以将数据库实体的创建移动到For循环中,并使用using块声明它。这将导致每次在for循环中释放每个实体块

选项2如果您的操作基本上是并行的,并且您对一个表实体所做的操作不依赖于任何其他表实体,那么您可以在db.SaveChanges之后调用databaseEntities.Detachrecord,这将使垃圾收集器能够回收实体的空间


查看您的代码,我怀疑其中任何一个都可以使用

如果您不需要更新实体,请使用MergeOption.NoTracking。上下文将不再保留对实体的引用,也不会进行修复。

不,表对象中没有dispose属性。我想您这里有些东西。如果我在for循环中声明一个新的数据库instacne,内存问题就会消失。然而,我认为这不是一个很好的解决方案。应该有某种方法告诉实体管理器清除缓存。这不是关于内存管理器,而是关于数据上下文。您必须告诉DataContext清除其缓存,内存管理器将随时回收内存。@Pavel,对大量记录执行操作是EF的一个弱点。如果我在大量实体中执行相同的操作,并且性能是优先考虑的,那么我可能会使用存储过程。这确实意味着您的一些业务逻辑现在在数据库中而不是模型中,但有时我们必须对这些事情采取务实的态度。分离10000条记录大约需要一分钟,而更新这些记录大约需要2秒钟。所以我想我会选择选项1。是的,虽然他加载了表实体,显然没有其他东西,做了一些工作,然后调用db.SaveChanges,这意味着他确实需要跟踪更改。
db.SaveChanges()
For Each record In records
    record.dispose ''only if class table got a dispose method
Next
records.clear
records = Nothing