- - PR -
OutOfMemoryExceptionの対策について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-16 20:22
Draさん、こんばんは。
ReadLine メソッドの解説には、以下のような文章があります。
わざわざ解説されているって事は、何かの加減で、割と頻繁に発生する可能性があるって事なんでしょうかねぇ。 あと、重箱の隅を突くようですが、
これは If strLine Is Nothing Then にしないと、常に Else の方へ流れませんでしたっけ? それと、
StreamReader とか StreamWriter とかは、Finally で Close すべきですね。 | ||||||||||||
|
投稿日時: 2006-05-16 21:43
うにくまさん・きくちゃんさん、ありがとうございます。
>If strLine Is Nothing Then >StreamReader とか StreamWriter とかは、Finally で Close すべきですね。 ご指摘ありがとうございます。 ReadLine メソッドの解説にあてはまりそうですね。レコード毎にbyte数が異なる為 Readメソッドの使用は難しいと考えられます。(ある項目をみて書込みを判断する)が検討してみます。 ありがとうございます。 | ||||||||||||
|
投稿日時: 2006-05-16 22:56
いいえ。.NET は GC 専任のスレッドがバックグラウンドでヒープのお掃除をします。 遠い昔に GDNJ で議論になりましたが for(long i = 0; i < 1000000; i++) { byte[] buffer = new byte [256 * 1024 * 1024]; } みたいなコードは、少なくとも .NET 1.x では OutOfMemoryException がスローされます。 | ||||||||||||
|
投稿日時: 2006-05-16 23:07
私も、ディスクの空き領域の関係で 2GB ですが、全く問題ありませんでした。タスクマネージャの報告によると、プロセスが使用するメモリは常に一定でした。なので、Stream 系の問題とは考えにくいです。 うにくまさんも指摘されているとおり、Exception.ToString() の値を、そのまま書き出してください。2日が過ぎようとしていますが、Read でエラーになることと、Exception.ToString() の値とを最初に出していれば、もっと早くに解決したように思います。 また、 If 条件(str1 = "1") Then のところも、文法的におかしいので、いろいろな処理を省略しているのだと思います。そこに本当の問題があるようにも思います。 | ||||||||||||
|
投稿日時: 2006-05-17 03:36
ですが、これはnewobj/newarrで(Large Objectの場合だけ?)適切にCollectされていなかった の方が自分としてはしっくりくるのですが。。。 まぁ、確認のしようがないんですけどね。 AutoFlushプロパティについてですが、 これは書き込みが既定バッファに満たなくてもFlushするかどうかという事だと思います。 たとえば、1100byteが書き込み(Write)されたとして、 Falseの場合は、1024byte (StreamWriterのバッファ -> FileStreamのバッファ) Trueの場合は、1100byte (StreamWriterのバッファ -> FileStreamのバッファ -> デバイス) がFlushされるということだと思います。それと処理も微妙に違います。 | ||||||||||||
|
投稿日時: 2006-05-17 09:15
みなさんありがとうございます。
現状は以下のように書込みなしの場合でも同様なエラーが発生し、解決しておりません。 エラーに関しては、「種類 System.OutOfMemoryException の例外がスローされました。」 のみしかとれません。 Dim strLine As String = "" Dim srFile As New System.IO.StreamReader("読込みファイル", System.Text.Encoding.Default) Dim sw As New System.IO.StreamWriter("書込みファイル", False, System.Text.Encoding.GetEncoding(932)) Try While Not strLine Is Nothing strLine = Nothing '1行ずつ読み込む strLine = srFile.ReadLine() If strLine Is Nothing Then '何も読み込まない時はWhile分を抜ける Exit While Else '書込みはなし End If End While Return true Catch ex As Exception Return false Finally srFile.Close() sw.Close() End Try | ||||||||||||
|
投稿日時: 2006-05-17 09:41
strLineってのをWhile内で宣言してもダメかいな?
GCの手助けにはなるだろう。(ってNothingと効果は同じだろうが) | ||||||||||||
|
投稿日時: 2006-05-17 09:48
私も 300MB ほどのファイルを作成し同様の実装をしてみましたが、正常に動作しました。
やはりファイル自体か、その他の実装による影響を疑った方が良いのではないでしょうか? unibon さんが、「問題の切り分け」の仕方を提示してくださっていますが、すべて試されていますか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |