在OCaml中,数组的大小限制为Sys.max_array_length。由于我在64位系统上,结果大约是2 ^ 54 - 1.但是,当我尝试
时Array.make (Sys.max_array_length / 100) 0;;
它不起作用。具体来说,我得到一个Out_of_memory异常。然后我通过ocamlrun运行它,看到以下消息。
Initial minor heap size: 2048k bytes
Initial major heap size: 992k bytes
Initial space overhead: 80%
Initial max overhead: 500%
Initial heap increment: 992k bytes
Initial allocation policy: 0
Initial stack limit: 8192k bytes
No room for growing heap
Fatal error: exception Out_of_memory
然后我尝试通过
来增加堆大小export CAMLRUNPARAM='s=18014398k'
这给了我一条新消息:
Initial minor heap size: 2097152k bytes
Initial major heap size: 992k bytes
Initial space overhead: 80%
Initial max overhead: 500%
Initial heap increment: 992k bytes
Initial allocation policy: 0
Initial stack limit: 8192k bytes
No room for growing heap
Fatal error: exception Out_of_memory
实际上,我不能再增加次要堆大小,因为它会说它无法初始化页表。我不确定我是否做错了,但似乎实际上不可能创建长度为Sys.max_array_length的数组 - 。
答案 0 :(得分:1)
64位系统上的数组中的每个条目将占用8个字节(比方说)。如果你想要一个2 ^ 54的数组,这将需要128 PB的地址空间。很可能你的系统不允许大的进程。
换句话说,你不能创造一个大的数组并不奇怪。
值得注意的是,在64位系统上,Sys.max_array_length
仅根据OCaml数据表示的细节给出上限。它并不是说你的特定系统会支持那么大的阵列。
<强>更新强>
如果您实际上试图找出对特定系统上的数据施加的大小限制,则需要调查您正在处理的系统。在64位系统上,在系统获得比现在更强大的功能之前,您实际上不会达到OCaml施加的限制。在此之前,Sys.max_array_length
值并不重要。唯一有趣的限制是你正在使用的系统强加的限制。
更新2
我不知道这是否有帮助,但这里是Sys.max_array_length
的代码:
let max_array_length = (1 lsl (word_size - 10)) - 1
请注意,它会根据机器的字大小返回常量值。它总是在所有64位计算机上返回相同的值,并且对于确定特定环境中特定进程可用的空间毫无用处。