OracleBulkCopyメモリー・リーク(OutOfMemory例外)

bulkinsert c# memory-leaks oracle sqlbulkcopy

質問

以下は、一時表dataTableからOracle DatabaseのdestTableにデータをバルク・コピーするために使用したコードです。 dataTableには約200万レコードがあります。

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

しかし、次の例外をスローします。 ここに画像の説明を入力

このデータロードプロセスを実行しているサーバーには十分なメモリがあります。データベースサーバー(Linux)に十分なメモリがないようです。以下はデータベースサーバのメモリスクリーンショットです: ここに画像の説明を入力

誰もこの問題を助けることができますか?ありがとう。

受け入れられた回答

根本原因を発見した場合、exeは32ビットで動作しており、1.5Gのメモリ制限があります。ターゲット・プラットフォームを変更し、Oracle.DataAccess.dllを64ビット・バージョンに置き換える必要があります。

また、別の解決策があります:バッチでデータをロードして、1.5Gのメモリ制限を超えないようにします。

更新:

"ORACLEBULKCOPYを使用したメモリリーク":Oracleのバルクコピーにはメモリリークの原因となるバグがあります.BatchSizeがデータサイズよりも小さい場合に発生します。 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は合法ですか? はい、理由を学ぶ