- - PR -
OutOfMemoryExceptionの対策について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-17 09:50
Draさん、お早うございます。
いや、読みとるデータは、レコード毎である必要はありません。 CR/LFを頼りに、自力で「レコード」を組み立てれば良いんです。
デバッグ実行して、キャッチした例外の StackTrace を確認すれば、もう少し詳細な情報が得られますよ。 | ||||||||
|
投稿日時: 2006-05-17 10:07
きくちゃんさん、ありがとうございます。
>CR/LFを頼りに、自力で「レコード」を組み立てれば良いんです。 対応は保留中です。 >StackTrace を確認すれば なぜかわかりませんがStackTrace情報はnothingです。 | ||||||||
|
投稿日時: 2006-05-17 10:27
ごめんなさい。 私の方でも試してみましたが、OutOfMemoryExceptionの場合は種類以外は取得できないみたいです。 言われてみれば確かにそうですよね。 | ||||||||
|
投稿日時: 2006-05-17 10:51
おっと、いい加減な事を書いてしまったみたいですね。 失礼しました。 甕星さんの情報も気になるんですが、Xpとかで試してみた結果も教えて下さいね。>Dra さん。 | ||||||||
|
投稿日時: 2006-05-17 11:07
OSに関しては、Win2000、WinXPで試しました。また.NET2002,2003及びC#に変換し試しましたがまったく同じ結果となりました。
データの問題かどうかも確認できません。 | ||||||||
|
投稿日時: 2006-05-17 11:19
これは、"正しく読めることが確定している行" を 300MB になるまで、 延々とコピーしたファイルで試せば確認できますよね。 また、提示された部分だけのソースで動作させていますか? 新規プロジェクトを生成し、単純に Button を 1 つだけ配置し実行してみてください。 (ミニマム コードで試した方が良いということです) このように、問題の「切り分け」をどんどんしていく必要があります。 もし試されているのであれば、洗いざらい書いてくださった方が良いです。
マシンを変えても再現したことから、少なくとも環境依存ではなさそうですね。 (こうやって「切り分け」して狭めていきます) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-05-17 23:28
ふと気になった。
> System.IO.StreamReader("読込みファイル", System.Text.Encoding.Default) > System.IO.StreamWriter("書込みファイル", False, System.Text.Encoding.GetEncoding(932)) 読み込むファイルは、Default コード ページ(Windows 2000 だから UTF-8?)で、人間が文字として認識できる文字のみが書き込まれているのだろうか?
ReadLine で例外が発生するということは、ここまで(20万行目くらいまで)は正常と判断できると思います。 StreamReader を直接開くのではなく、seek 可能なストリームから StreamReader を作り、例外が発生する直前の位置を取得する。例外が発生したらプログラムを修正して、さっきまで進んでいた位置に飛ばす。そして実行すると、データが累積するのが悪いのか、ファイルのが悪いのか、判断できるでしょう。
UNIX マシン、または Cygwin などの UNIX コマンドが使える環境があるなら、wc -l で行数を数え、tail で20万行目以降を別のファイルに落とすことも出来るでしょう。 コマンドプロンプトから、type コマンドで出力することも出来そう。more コマンドは、落ちるかな? あるいは、そのファイルが正しく(仕様通りか、こちらの意図通り)出力されていることは、どうやって確認したのでしょう? | ||||||||
|
投稿日時: 2006-05-19 09:32
Draさんこんにちは。
Stringは値を代入する度に、内部的に新たなStringクラスが作成されると 記憶しています。 以前、.NET開発していた際にも、コード分析を行った方から、Stringに対し 「+=」のような記述を多用する場合は「StringBuilder」を使うべきだと 指摘された事があります。 ぶさいくろうさんも仰っていましたが、「strLine」をWhileの内側で宣言する 方法が良いかもしれません。 或いは、「strLine」をStringBuilderで宣言し、「ReadLine」の直前に 「strLine」を「Remove」する事で、メモリの消費を抑えられそうな気がします。 これでも解決されないようであれば、余分な(処理に影響の無い)コードを 削ぎ落とすなどして、問題点の切り分けを地道にして行くしかなさそうですね。 |