Dispose()不会阻止内存不足异常

Mik*_*yev 1 c# dispose out-of-memory

我有一个巨大的日志文件,其中有大约1500万行.我必须将所有这些行移植到Oracle数据库.这就是我要做的事情:

  1. 我读取了DataTable的行(行用逗号分隔,以便它们形成列).我通过StreamReader阅读这些行并将其放入使用中,以便在完成阅读时将其删除.
  2. 我把一个计数器增加1,每行读取到DataTable.
  3. 当该计数器达到40.000时,我在OracleBulkCopy的帮助下将所有行导入数据库.
  4. 导入完成后,我说:

    bulkCopier.Dispose();
    dataTable.Dispose();

然而,这对任何方式都无济于事.在任务管理器中,我看到内存使用量不断增长,直到内存不足为止.现在我的问题是没有Dispose()方法立即释放内存?如果是,那么为什么内存使用会累积,好像所有DataTable和OracleBulkCopy对象都保留内存一样.

Ser*_*rvy 5

Dispose不会立即释放托管内存.当您调用dispose时,Dispose将释放任何锁定到非托管资源(例如内存),并且与托管内存无关.

您的数据表全部填充了托管内存中的托管对象.打电话.对它进行处理不会做太多事情.您需要清除DataTable中的所有数据(有一个方便的Clear方法),这将允许垃圾收集器在将来的某个时间点释放内存,当它感觉像是在清理时.

使用分析器,您可以看到程序中所有内存的保存位置.很可能有许多其他托管对象要保留在引用中,这会阻止它们被垃圾回收.这与此无关Dispose.