メモリが足りていても 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 オブジェクトを拡大しようとしている。
つまりメモリが足りていたとしても、StringBuilderに MaxCapacityを超えて文字を追加しようとすると 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 までのファイルしか読み込めません. 悲しいね!