OracleBulkCopy 메모리 누출 (OutOfMemory 예외)

bulkinsert c# memory-leaks oracle sqlbulkcopy

문제

다음은 임시 테이블 dataTable의 데이터를 Oracle Database의 destTable에 대량 복사하는 데 사용한 코드입니다. dataTable에는 약 2 백만 개의 레코드가 있습니다.

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();
                }
            }

그러나 다음 예외를 throw합니다. 여기에 이미지 설명을 입력하십시오.

이 데이터 로딩 프로세스를 실행하는 서버에는 메모리가 충분하므로 데이터베이스 서버 (Linux)에 충분한 메모리가없는 것처럼 보입니다. 아래는 데이터베이스 서버 메모리 스크린 샷입니다. 여기에 이미지 설명을 입력하십시오.

누구든지이 문제에 도움이 될 수 있습니까? 감사.

수락 된 답변

근본 원인을 발견, exe는 32 비트에서 실행되고 1.5G 메모리 제한이 있습니다. 대상 플랫폼을 변경하고 Oracle.DataAccess.dll을 64 비트 버전으로 바꿔야합니다.

또한 대체 솔루션이 있습니다 : 1.5G 메모리 제한을 초과하지 않도록 데이터를 일괄 적으로로드하십시오.

최신 정보:

"ORACLEBULKCOPY를 사용하여 메모리 누출": Oracle 대량 복사에 메모리 누수가 발생하는 버그가 있습니다. 이는 BatchSize가 datatable 크기보다 작을 때 발생합니다. BatchSize를 수정하거나 ODAC를 상위 버전으로 업데이트해야합니다.

참조 : https://community.oracle.com/message/4593452#4593452



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.