- 締切済み
OutOfMemoryExceptionの回避策について
VB(.NET Framework)とは便利なもので、 dim a as integer, b as integer a = 100 b = 100 dim c(a, b) as double '→ 配列の要素数を実行時に決定できる '↓ たったこれだけの記述で、テキストファイル全行を配列に格納できる '↓ しかも、配列の要素数は勝手に決まる Dim lines As String() = System.IO.File.ReadAllLines("abc.txt", enc) 等が可能であり、N88BASICやTurboC++の頃と比べると隔絶の感があります。 しかし、世の中そう甘くはなく、 a = 10000 b = 10000 だと、 dim c(a, b) as double のところで・・・ あるいは、"abc.txt"が100万行もあるものだと、 Dim lines As String() = System.IO.File.ReadAllLines("abc.txt", enc) のところで「OutOfMemoryException」が発生します。 私が一応調べたところ、OutOfMemoryExceptionについて鋭く切り込んでいるものとしては、 http://msdn.microsoft.com/ja-jp/library/9w766t6y(VS.80).aspx http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31510&forum=36&3 http://oshiete1.goo.ne.jp/qa4920589.html と、あといくつかしかありませんでした。 32bitアプリケーションには、確かに「利用できるメモリ量は通常2GB」という壁があるのかもしれませんが、100万行でもファイルサイズはせいぜい400MByte程度ですよ。「連続したメモリ領域の確保に失敗する」のであれば、OSの力を借りてでも何とかするべきでしょう。 「64 KB 以上のメモリを消費する大規模メソッドのプログラミングを行わない」なんて、昔のsmallモデルを思い出します。 64bitOSが実稼働する時代になっても、やはり ・メモリを確保できない可能性を考慮する ・危なそうな時は、工夫する しかないものなのでしょうか。 確かに、「それが常識」と言ってしまえばそれまでなのですが。 Listジェネリッククラスをちまちまと使うより、素の配列の方がはるかに処理が軽いはず。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- wildcat-yp
- ベストアンサー率37% (303/813)
ご自分のプログラムで、たとえば、 a = 10000 b = 10000 とした際に、メモリはどのくらい使用するのか計算しましたか? また、100万のStringオブジェクトのメモリは? まさか400MBのファイルを1行ずつStringに入れていって400MBで済むなんて思っていませんよね? あまりこういうことをかくと馬鹿にみられますので控えた方が良いですよ。