「みんな教えて! 選手権!!」開催のお知らせ

 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 …
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
http://oshiete1.goo.ne.jp/qa4920589.html
と、あといくつかしかありませんでした。

 32bitアプリケーションには、確かに「利用できるメモリ量は通常2GB」という壁があるのかもしれませんが、100万行でもファイルサイズはせいぜい400MByte程度ですよ。「連続したメモリ領域の確保に失敗する」のであれば、OSの力を借りてでも何とかするべきでしょう。
 「64 KB 以上のメモリを消費する大規模メソッドのプログラミングを行わない」なんて、昔のsmallモデルを思い出します。

 64bitOSが実稼働する時代になっても、やはり
・メモリを確保できない可能性を考慮する
・危なそうな時は、工夫する
しかないものなのでしょうか。
 確かに、「それが常識」と言ってしまえばそれまでなのですが。
 Listジェネリッククラスをちまちまと使うより、素の配列の方がはるかに処理が軽いはず。

A 回答 (1件)

ご自分のプログラムで、たとえば、


 a = 10000
 b = 10000
とした際に、メモリはどのくらい使用するのか計算しましたか?
また、100万のStringオブジェクトのメモリは?

まさか400MBのファイルを1行ずつStringに入れていって400MBで済むなんて思っていませんよね?

あまりこういうことをかくと馬鹿にみられますので控えた方が良いですよ。
    • good
    • 4

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報