Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9304

メモリが足りていても OutOfMemoryException が出る可能性がある (C#)

$
0
0

メモリが足りていても OutOfMemoryException が出る可能性がある (C#)

Microsoft の OutOfMemoryException Classのドキュメントに以下のような記載があります.

An OutOfMemoryException exception has two major causes:
- You are attempting to expand a StringBuilder object beyond the length defined by its StringBuilder.MaxCapacity property.

適当訳:

OutOfMemoryException 例外には2つの大きな要因があります:
- StringBuilder.MaxCapacity プロパティで定義された長さを超えて StringBuilder オブジェクトを拡大しようとしている。

つまりメモリが足りていたとしても、StringBuilderMaxCapacityを超えて文字を追加しようとすると OutOfMemoryExceptionが発生します.

でもそれってメモリ不足と一致するんでしょって思いますよね? 実はそうではありません.

StringBuilder.MaxCapacity Property

publicintMaxCapacity{get;}

MaxCapacityは Int32 なんです. なので最大文字数は Int32.MaxValue = 2147483648 となります. つまりざっくりで 4GB となります(.NET の Charは 16bit です). 結果として 64bit 環境ではメモリが余っていても OutOfMemoryException が発生することがあります.

お手軽便利でみんな大好き File.ReadAllTextは内部で StreamReader.ReadToEndを呼び出しており、StreamReader.ReadToEndは内部で StringBuilderを使っているため、File.ReadAllTextは ASCII 文字のみのファイルの場合は最大でも 2GB までのファイルしか読み込めません. 悲しいね!


Viewing all articles
Browse latest Browse all 9304

Trending Articles