Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
C# Dispose()不能防止内存不足异常_C#_Dispose_Out Of Memory - Fatal编程技术网

C# Dispose()不能防止内存不足异常

C# Dispose()不能防止内存不足异常,c#,dispose,out-of-memory,C#,Dispose,Out Of Memory,我有一个巨大的日志文件,其中大约有1500万行。我必须将所有这些线路移植到Oracle数据库。下面是我要做的: 我读取数据表中的行,行之间用逗号分隔,以便 它们形成列。我通过StreamReader阅读这些行并将其放入 使用,以便在完成阅读后将其清除。 我放置了一个计数器,每读取一行到DataTable,计数器就递增1。 当计数器达到40.000时,我在OracleBulkCopy的帮助下将所有行导入数据库。 导入完成后,我说: 散装复印机。处理; dataTable.Dispose 然而,这无

我有一个巨大的日志文件,其中大约有1500万行。我必须将所有这些线路移植到Oracle数据库。下面是我要做的:

我读取数据表中的行,行之间用逗号分隔,以便 它们形成列。我通过StreamReader阅读这些行并将其放入 使用,以便在完成阅读后将其清除。 我放置了一个计数器,每读取一行到DataTable,计数器就递增1。 当计数器达到40.000时,我在OracleBulkCopy的帮助下将所有行导入数据库。 导入完成后,我说:

散装复印机。处理; dataTable.Dispose


然而,这无助于解决任何问题。在任务管理器中,我看到内存使用量不断增加,直到内存不足。现在我的问题是处置方法不立即释放内存吗?如果是,那么为什么内存使用会累积,就好像所有DataTable和OracleBulkCopy对象都保留内存一样。

Dispose不会立即释放托管内存。Dispose在调用Dispose时释放对非托管资源(如内存)的所有锁,与托管内存无关

在托管内存中,您的数据表都填充了托管对象。打电话,处理一下也没什么用。您需要清除DataTable中的所有数据。有一种方便的清除方法,它允许垃圾收集器在将来某个时候释放内存,而此时它感觉像是在清理东西


使用探查器,您可以看到程序中所有内存的确切存放位置。很可能还有许多其他托管对象被您保留在引用上,这会阻止它们被垃圾收集。这与Dispose无关。

Dispose不会立即释放托管内存。Dispose在调用Dispose时释放对非托管资源(如内存)的所有锁,与托管内存无关

在托管内存中,您的数据表都填充了托管对象。打电话,处理一下也没什么用。您需要清除DataTable中的所有数据。有一种方便的清除方法,它允许垃圾收集器在将来某个时候释放内存,而此时它感觉像是在清理东西

使用探查器,您可以看到程序中所有内存的确切存放位置。很可能还有许多其他托管对象被您保留在引用上,这会阻止它们被垃圾收集。这与处置无关

现在我的问题是不释放内存 马上

不一定。它将释放的唯一内存是非托管资源分配的内存量。它对托管堆没有影响

您需要做的是确保没有对这些悬空数据表实例的引用。您可能需要将它们从集合中删除,或者根据需要将变量引用置空

现在我的问题是不释放内存 马上

不一定。它将释放的唯一内存是非托管资源分配的内存量。它对托管堆没有影响


您需要做的是确保没有对这些悬空数据表实例的引用。您可能需要将它们从集合中删除,或者根据需要将变量引用调零。

不,dispose会发出信号,指示要拆下内部句柄。具有Dispose的对象实际上稍后会获得GC-d

如果这些是IDisposable,您应该尝试在using块中使用它们,根据使用后自动发布的文档

您可以使用GC.Collect强制进行GC收集,但我不认为这些对象是未绑定的grabage,.NET比这更好


你不能创建一个小型转储并检查什么被阻塞以及为什么阻塞吗

不,dispose向要拆卸的内部手柄发出信号。具有Dispose的对象实际上稍后会获得GC-d

如果这些是IDisposable,您应该尝试在using块中使用它们,根据使用后自动发布的文档

您可以使用GC.Collect强制进行GC收集,但我不认为这些对象是未绑定的grabage,.NET比这更好


你不能创建一个小型转储并检查什么被阻塞以及为什么阻塞吗

我想你是在假设流是问题所在,也许是错误的。这些绳子有多大?如果它们是在LOH上分配的,那么您可能会造成大量碎片。使用探查器查看内存分配的位置。在这些情况下,GC.Collect可能会有所帮助,或者编译64位的应用程序。即使在32位上,如果内存压力过高,GC也应该自动运行。也许这些对象太大了,它们会被放在一个大的对象堆上?获取一个内存pr
然后用它来找出内存中的内容。我们无法知道您的机器上发生了什么。我遵循@Eric Lippert和Ed s.的建议,并使用探查器进行了检查,而真正导致问题的是流阅读器。现在我需要找到一种方法,从我停止使用新的流阅读器对象的地方开始。谢谢大家。若你们有内存问题,那个么转储数据表——这是一个内存占用问题。到目前为止,在.NET中已经出现了收藏。我不知道Oracle,但在MSSQL中,我使用TVP Table Value参数获得了最快的上传速度,我将它们与集合哈希表(而不是数据表)一起使用。它就像一个参考数据阅读器。我解析一些文本文件,加载单词,每晚加载数百万。我在主线程上进行解析,然后每10000行使用一个后台工作线程加载到另一个线程上的SQL。我认为您假设流是问题所在,可能是错误的。这些绳子有多大?如果它们是在LOH上分配的,那么您可能会造成大量碎片。使用探查器查看内存分配的位置。在这些情况下,GC.Collect可能会有所帮助,或者编译64位的应用程序。即使在32位上,如果内存压力过高,GC也应该自动运行。也许这些对象太大了,以至于它们被放在了大对象堆上?找一个内存分析器,用它来找出内存中的内容。我们无法知道您的机器上发生了什么。我遵循@Eric Lippert和Ed s.的建议,并使用探查器进行了检查,而真正导致问题的是流阅读器。现在我需要找到一种方法,从我停止使用新的流阅读器对象的地方开始。谢谢大家。若你们有内存问题,那个么转储数据表——这是一个内存占用问题。到目前为止,在.NET中已经出现了收藏。我不知道Oracle,但在MSSQL中,我使用TVP Table Value参数获得了最快的上传速度,我将它们与集合哈希表(而不是数据表)一起使用。它就像一个参考数据阅读器。我解析一些文本文件,加载单词,每晚加载数百万。我在主线程上进行解析,然后每10000行使用一个后台工作线程加载到另一个线程上的SQL。