C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: メモリを浪費せず大量データをOracleへ反映


(過去ログ 99 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■58842 / inTopicNo.1)  メモリを浪費せず大量データをOracleへ反映
  
□投稿者/ idaten (1回)-(2011/04/27(Wed) 23:15:35)

分類:[VB.NET/VB2005 以降] 

VB2005,WindowsXP SP3(クライアント)、Oracle 11g R1+Windows Server 2003(DBサーバ)で開発しています。テストファイルから10万行か100万行(1レコード400byte)
のレコードを読み取り、他のテーブルを参照したり1レコードから子レコードを生成してOracleへ反映しています。ところがこのプログラムを実行するとどんどんメモリを食い、1GBくらい使ってOutOfMemory例外で落ちてしまいます(クライアント環境:メモリ3G搭載)。また、ハードのスペックが高いサーバ上で実行すると落ちなくなりましたが、タスクマネージャでプロセスを見ていると1.5GBまで使っています。取り込んだデータは最初dataTableに溜め込みUpdateしていましたが、ガーベージを行ってもメモリ使用量が減らないので、1行読み込んだら反映すべきデータをコマンドオブジェクト(ADO.NET)を使ってテーブルを更新してもメモリ消費量はほぼ変わりませんでした。こういった大量デーを処理する際、メモリを極力使わないようにして、かつ処理速度もあまりに遅くならないように処理する方法は無いでしょうか。
引用返信 編集キー/
■58843 / inTopicNo.2)  Re[1]: メモリを浪費せず大量データをOracleへ反映
□投稿者/ 渋木宏明 (74回)-(2011/04/28(Thu) 08:03:40)
渋木宏明 さんの Web サイト
なんちゅーか、こー、どこで(なにが)メモリをそれだけ使っているのか?とかを調べてみてもらわないないことにはなんとも。
引用返信 編集キー/
■58844 / inTopicNo.3)  Re[1]: メモリを浪費せず大量データをOracleへ反映
□投稿者/ オショウ (586回)-(2011/04/28(Thu) 09:27:39)
> のレコードを読み取り、他のテーブルを参照したり1レコードから子レコードを生成してOracleへ反映しています。

  この処理自体をDataTable上で行っています?
  またやはりDataTable使っているのがメモリ食いの原因かと。

  SQL文1発でUPDATEするような方法書ければ、5000〜10000件づつ構造体配列に
  読み込んで処理するば、速度もそこそこなんとかなるのでは・・・と。

  あと、それでもメモリを食うようであれば、Oracleとの接続以降でインスタン
  スが解放されていないバグがあるとか・・・
  因みに、当初はODP.NETでしたか?ADO.NETで書き直しても同じ・・・とありま
  すが、具体的にどうやっておられたのかを書かないと、上記だけでは、解消に
  いたるコメントを得るのは難しいかと。

※ DevPartner Studio Professionalの評価版を使ってザックリとどこが悪いか、
  解析に使うとか・・・昔、そうやってしのいだことあります。

以上。
引用返信 編集キー/
■58845 / inTopicNo.4)  Re[1]: メモリを浪費せず大量データをOracleへ反映
□投稿者/ shu (665回)-(2011/04/28(Thu) 10:27:26)
No58842 (idaten さん) に返信
> VB2005,WindowsXP SP3(クライアント)、Oracle 11g R1+Windows Server 2003(DBサーバ)で開発しています。テストファイルから10万行か100万行(1レコード400byte)
> のレコードを読み取り
違うかもしれませんがこれを一括で行ったりしてませんか?これだけで400MB取られます。
引用返信 編集キー/
■58855 / inTopicNo.5)  Re[2]: メモリを浪費せず大量データをOracleへ反映
□投稿者/ やじゅ (1878回)-(2011/04/28(Thu) 14:47:45)
やじゅ さんの Web サイト
> ■No58842 (idaten さん) に返信
作業用の AppDomain を作成して、処理後に Unload してみてるとか
引用返信 編集キー/
■58885 / inTopicNo.6)  Re[3]: メモリを浪費せず大量データをOracleへ反映
□投稿者/ PATIO (110回)-(2011/05/02(Mon) 14:13:21)
2011/05/02(Mon) 16:12:55 編集(投稿者)

渋木宏明さんも書かれていますが、まずは現状分析をもっとやらないと
検討もできないのではないかと思います。
もし既にやっていて結果を持っているのであれば、それも提示しないと無理かなと。

例えばですが、テキストファイルの処理部分とSQLの発行部分とか幾つかの部分に
分かれていると推測しますが、
SQLの発行処理を丸ごとコメントアウトしたらどうなるのかとか、
テキストファイルを読み込まずにメモリ上の固定情報だけで処理したらどうなるのかとか。
実際にはインクリメントしてデータを作成する必要もあるかもですが、
そういう感じで処理を一部動かない状態にして動かす事である程度メモリを大量に
消費している場所が分からないでしょうか?

メモリの消費量に関しては機能を少しずつ追加で組み込みながら監視するとどの段階で
利用メモリが急に増えたのかがわかると思うのです。
もしかしたら処理全体の積み上げてそうなっている可能性も有るかもしれません。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -