トップ回答者
配列、リストボックスの最大要素数

質問
-
いつもお世話になっております。
分からないことがあり、質問を投稿しました。
visual studio 2019のc#でWindowsフォームアプリケーションを使用しています。
PCのスペックはメモリーが4GBで、Windows10を使用しています。
質問の内容ですが、
文字列配列(1次元)の最大要素数は、どこまで取れるのか? と、
リストボックスの最大アイテム数は、いくつまで取れるのかということです。
インターネットで検索したのですが、こうした情報をキャッチすることができませんでした。
私が使用しているPCのメモリーは4GBですので、メモリーが埋まるまで、
配列の要素、またはリストボックスのアイテム数を増やせるのか、
はたまた決まった数までしか増やせないのかが分かりません。
どなたかご存知の方がいれば、ご教授宜しくお願い申し上げます。
- 編集済み ももたろう 2020年2月28日 6:25
回答
-
Array Class (System) | Microsoft Docs
日本語版は訳がアレなので上記は英語版ですが、ArrayクラスのRemarksにて説明されています。
簡単に説明すると、以下のような制限があります。
- 配列は各次元のトータルで40億要素が上限。例えば2次元配列なら63000x63000ぐらいですかね。
- 各次元の最大インデックスは0X7FEFFFFF(= 2,146,435,071)。
Byteまたは1バイトの構造体の配列の場合のみ、0X7FFFFFC7 (= 2,147,483,591)が最大インデックス。 - .NET Frameworkでは、1つの配列の最大サイズは 2GB。String配列の場合、1要素のサイズは、中身に関係なく、32bitプロセスの場合4バイト、64bitプロセスの場合8バイトになります。
64bitプロセスの場合、構成ファイルでgcAllowVeryLargeObjectsを指定することによりこの2GB制限をいくらか緩和できます。
ListBoxのアイテム数については残念ながら存じません。とりあえず65536以上追加することはできるようです。これぐらい入れようとしてもめちゃくちゃ重いので、これ以上入れるのはあんまり現実的ではなさそうです。ちなみに、今は亡きWindows 9x系では、32767までだったようです。
なお、多少なりと高級なOSであれば、仮想メモリという機構が導入されており、PCに物理的にメモリをいくら載せているかと、各プロセスがメモリをいくら使えるかは関係なくなっています。
- 回答としてマーク ももたろう 2020年3月2日 7:47
すべての返信
-
Array Class (System) | Microsoft Docs
日本語版は訳がアレなので上記は英語版ですが、ArrayクラスのRemarksにて説明されています。
簡単に説明すると、以下のような制限があります。
- 配列は各次元のトータルで40億要素が上限。例えば2次元配列なら63000x63000ぐらいですかね。
- 各次元の最大インデックスは0X7FEFFFFF(= 2,146,435,071)。
Byteまたは1バイトの構造体の配列の場合のみ、0X7FFFFFC7 (= 2,147,483,591)が最大インデックス。 - .NET Frameworkでは、1つの配列の最大サイズは 2GB。String配列の場合、1要素のサイズは、中身に関係なく、32bitプロセスの場合4バイト、64bitプロセスの場合8バイトになります。
64bitプロセスの場合、構成ファイルでgcAllowVeryLargeObjectsを指定することによりこの2GB制限をいくらか緩和できます。
ListBoxのアイテム数については残念ながら存じません。とりあえず65536以上追加することはできるようです。これぐらい入れようとしてもめちゃくちゃ重いので、これ以上入れるのはあんまり現実的ではなさそうです。ちなみに、今は亡きWindows 9x系では、32767までだったようです。
なお、多少なりと高級なOSであれば、仮想メモリという機構が導入されており、PCに物理的にメモリをいくら載せているかと、各プロセスがメモリをいくら使えるかは関係なくなっています。
- 回答としてマーク ももたろう 2020年3月2日 7:47