質問: 配列におさめる数を比較的小さな数とした場合、 各言語(例、C, C++, Python, Ruby, Haskell 等)において扱える配列の大きさはどれくらいでしょうか? また、もしそれ以上の大きさの配列が必要な計算が出てきた場合 どう対処すればよろしいでしょうか?
回答: ### Ruby Ruby(2.4.0, macOS 10.12.2, 64bit)で`Array.new(サイズ)`をpry上で試して見ました。 * `2**63` 〜 : Cでのlongに変換できないというエラー * `2**60` 〜 `2**63-1` : サイズが大きすぎるというエラー * `2**43`ぐらい 〜 `2**60-1` : メモリ確保失敗でエラー * `2**32`ぐらい 〜 `2**43`ぐらい : 作ろうとするが50GiBぐらいメモリをとったぐらいで落ちた(pryで試したから?) * `0` 〜 `2**32`ぐらい : できる、しかし、`2**32`だと32GiBとかあり得ないぐらいメモリが消費される。重いけど、一応動くようだ。 言語仕様上は特に制限が無いため**システムが許す限り無限大**と思われます。Cでの実装上の限界としてlong(macOS 64bitでは64bitになる)が収まる`2**63-1`があるようですが、実際は`2**60-1`以下に制限されているようです。さらに、それが収まるだけのメモリが必要です。メモリさえ収まればいくらでもいけますが、1要素あたり8バイト必要なようですので、`2**60-1`を収めるには、8EiB(エクスビバイト)が認識できるシステムが必要でしょう。RHEL7ですら理論上はメモリの最大が64TiBのため、`2**43`が限界になると思われます。 ### C たしか、配列の添字が`int`に制限されていたはずです(ちょっと曖昧、C11のドラフトをさらっと見たけど、見つけられなかった)。現在のほとんどのシステムでは`int`は32bitのため、最大値が2^31-1になりますが、Cの規格上は`int`は16bit以上であればいくらでも大きくてもいいので、システムによってはより大きい値を扱えるかも知れません。 ### ECMAScript 言語仕様として、Arrayの`length`プロパティが2^32未満(2^32-1以下)という制約があります。実際は、動作する環境のメモリ次第と思われます。 参考: ECMAScript® 2016 Language Specification#9.4.2Array Exotic Objects