- PR -

OutOfMemoryExceptionの対策について

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-05-16 12:32
仮想メモリが無いか非常に小さい、とかいうオチはさすがにないですよね。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-16 12:58
引用:

囚人さんの書き込み (2006-05-16 12:32) より:

仮想メモリが無いか非常に小さい、とかいうオチはさすがにないですよね。


その場合は、Windows 2000 側からも悲鳴があがるはずです。(;^-^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
chack
常連さん
会議室デビュー日: 2002/11/18
投稿数: 48
お住まい・勤務地: 埼玉県
投稿日時: 2006-05-16 13:11
引用:

Draさんの書き込み (2006-05-16 11:42) より:

ちなみにマシンのメモリは500MB程度です。




500MBというのは物理メモリですよね?
物理メモリ容量に関係なく、32bit系OSでプロセスが使用可能な
仮想メモリ空間は 2GB となります。

この 4GT RAM チューニングは、Windows2000, Windows XP, Windows Server 2003等の
32bit NT系OSで有効です。

なお、GCを行っていてもメモリ使用量が増えるというのは、何とも言えませんが、
アンマネージヒープがどこかで使われているのでは。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-05-16 15:29
ちょっと質問ですが、データは正しいですか?
間違いなくちゃんと改行が入っていますか?
また、一行は大体どれくらいの長さで、どれくらいの項目数でしょうか?
Dra
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 111
投稿日時: 2006-05-16 16:22
サイズの問題上、確認できませんがデータは正しいと思います。
改行の点も同様です。
データに関しては、1レコード、54項目で300byte程度です。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-05-16 16:32
引用:

Draさんの書き込み (2006-05-16 16:22) より:
サイズの問題上、確認できませんがデータは正しいと思います。
改行の点も同様です。
データに関しては、1レコード、54項目で300byte程度です。


一傍観者ですが、不思議ですね。単にテキストファイルを1行ごとに読んでフィルター処理してテキストファイルを書き出すだけなのですよね。こんな単純なことでメモリー不足のエラーになっていたら、巷の大抵のアプリケーションがこのエラーに遭遇してしまいそうです。

つぎの点を確認されてはどうでしょうか。
・読み込むファイルを本番データーではない、単純なテキストファイルにして試してみる。サイズは本番と同じだけど単に "ABCDEFGHI..." が何万行もあるような内容のテストデーターをなんらかの方法で作り出して使う。
・問題のプログラムの部分だけを切り出して単体の Windows アプリケーションとして実行してみる。今は Web アプリケーションなどではないのでしょうか?再現できるプログラムを提示されれば他のかたも手近な環境で試せますし。
・ファイルを読むだけにして、書くのをやめてみる。
・その他、ウィルス対策ソフトウェアなどを疑ってみる?

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
Dra
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 111
投稿日時: 2006-05-16 17:30
unibonさん、ありがとうございます。
>・読み込むファイルを本番データーではない、単純なテキストファイルにして試してみる。サイズは本番と同じだけど単に "ABCDEFGHI..." が何万行もあるような内容のテストデーターをなんらかの方法で作り出して使う。
試してみます。

>・問題のプログラムの部分だけを切り出して単体の Windows アプリケーションとして実行してみる。今は Web アプリケーションなどではないのでしょうか?再現できるプログラムを提示されれば他のかたも手近な環境で試せますし。
元からWindowsアプリです。

>・ファイルを読むだけにして、書くのをやめてみる。
間違っておりました、読み込みではなく書き込み時にエラーが発生していました。
以下の何百万レコードのループ処理で発生しています。
sw.Write(strLine)
sw.Write(vbCr + vbLf)

うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-16 17:45
StreamReader/StreamWriterのバッファは指定しない限り、
1024+4096byte以上使用されることはなく適宜Flushされます。
明示的にFlushされるまですべてを保持しているわけではありません。
なので、これらのクラスが原因とは考えにくいです。

試しに4GBのファイルを作成し、Read/ReadLine,Write/WriteLineを
色々と組み合わせてみましたが、読み書き共に問題なく動作しました。

例外情報を編集せずに提示してみては?



ちなみに追いつく追いつかないとはどういう意味なのでしょうか?
GC中は他スレッドは停止すると認識してるんですが・・・

スキルアップ/キャリアアップ(JOB@IT)