OracleBulkCopy内存泄漏(内存溢出异常) [英] OracleBulkCopy Memory Leak(OutOfMemory Exception)

查看:2041
本文介绍了OracleBulkCopy内存泄漏(内存溢出异常)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是我用来从一个临时表中的dataTable数据bulkcopy到Oracle数据库destTable的代码。 DataTable中有大约200万的记录。

Below is the code I used to bulkcopy data from a temp table dataTable into a destTable in Oracle Database. The dataTable has about 2 million records.

using (OracleBulkCopy bulkCopy = new OracleBulkCopy(VMSDATAConnectionString))
            {
                try
                {
                    foreach (OracleBulkCopyColumnMapping columnMapping in columnMappings)
                        bulkCopy.ColumnMappings.Add(columnMapping);

                    bulkCopy.DestinationTableName = destTableName;
                    //bulkCopy.BatchSize = dataTable.Rows.Count;
                    //bulkCopy.BulkCopyTimeout = 100;                   
                    int defaultSize = 5000;
                    int.TryParse(ConfigurationManager.AppSettings["OracleBulkCopyBatchSize"], out defaultSize);
                    bulkCopy.BatchSize = defaultSize;
                    int timeOut = 100;
                    int.TryParse(ConfigurationManager.AppSettings["OracleBulkCopyTimeout"], out timeOut);
                    bulkCopy.BulkCopyTimeout = timeOut;
                    Console.WriteLine("Bulk insert from {0} to {1} started at: {2}\r\nBatchSize : {3}, BulkCopyTimeout : {4} ", dataTable.TableName, destTableName, DateTime.Now.ToString("HH:mm:ss"), bulkCopy.BatchSize.ToString(), bulkCopy.BulkCopyTimeout.ToString());
                    bulkCopy.WriteToServer(dataTable);
                    Console.WriteLine("Bulk insert from {0} to {1} finished at: {2}", dataTable.TableName, destTableName, DateTime.Now.ToString("HH:mm:ss"));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error happened during bulk copy from {0} to {1}\r\nBatchSize : {2}, BulkCopyTimeout : {3}\r\n Error message {4}", dataTable.TableName, destTableName, bulkCopy.BatchSize.ToString(), bulkCopy.BulkCopyTimeout.ToString(), ex.ToString());
                    bulkCopy.Close();
                    bulkCopy.Dispose();
                }
            }



但它抛出以下异常:
< IMG SRC =http://i.stack.imgur.com/qeKdB.pngALT =在这里输入的形象描述>

But it throws following exception:

运行该数据加载服务器过程肯定有足够的内存,它看起来像数据库服务器(Linux版)没有足够的内存。下面是数据库服务器内存的屏幕截图:

The server running this data loading process definitely has enough memory, it looks like the database server (linux) does not have enough memory. Below is the database server memory screen shot:

任何人都可以有此问题的帮助?谢谢你。

Can anyone help with this issue? Thanks.

推荐答案

找到根源,exe文件在32位上运行,它有一个1.5G的内存限制。 。需要改变目标平台,并更换Oracle.DataAccess.dll到64位版本

Found the root cause, the exe is running in 32 bit and it has a 1.5G memory limit. Need to change the target platform and replace Oracle.DataAccess.dll to 64 bit version.

另外还有一个替代的解决方案:在批量加载数据,所以它不会超过1.5 。2G内存限制。

Also there is an alternative solution: load data in batch so it will not exceed 1.5 G memory limit.

更新:

内存泄漏使用ORACLEBULKCOPY:神谕批量复制了一些bug导致内存泄漏,它发生的时候BATCHSIZE小于数据表的大小。
需要修改BATCHSIZE或更新ODAC更高版本

"MEMORY LEAK USING ORACLEBULKCOPY": the oracle bulk copy has some bug that causes memory leak, it happens when the BatchSize is less than datatable size. Need to modify the BatchSize or update ODAC to higher version.

参考:的 https://community.oracle.com/message/4593452#4593452

这篇关于OracleBulkCopy内存泄漏(内存溢出异常)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆