OCaml:Sys.max\u数组长度和较小堆大小

OCaml:Sys.max\u数组长度和较小堆大小,ocaml,Ocaml,在OCaml中,数组的大小限制为Sys.max_array_length。因为我使用的是64位系统,所以结果大约是2^54-1。然而,当我尝试 Array.make (Sys.max_array_length / 100) 0;; 它不起作用。特别是我得到了一个内存不足的异常。然后我通过ocamlrun运行了这个,看到了下面的消息 Initial minor heap size: 2048k bytes Initial major heap size: 992k bytes Initial

在OCaml中,数组的大小限制为Sys.max_array_length。因为我使用的是64位系统,所以结果大约是2^54-1。然而,当我尝试

Array.make (Sys.max_array_length / 100) 0;; 
它不起作用。特别是我得到了一个内存不足的异常。然后我通过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\u array\u length-1的数组。

在64位系统上,数组中的每个条目都将占用8个字节(例如)。如果您想要其中的2^54个数组,则需要128 PB的地址空间。很可能您的系统不允许这么大的进程

换句话说,不能创建这么大的数组一点也不奇怪

很好的一点是,在64位系统上,
Sys.max\u array\u length
仅根据OCaml数据表示的细节给出上限。这并不是说您的特定系统将支持这么大的阵列

更新

如果您确实在试图找出对特定系统上的数据施加的大小限制,则需要调查您正在使用的系统。在64位系统上,在系统变得比现在强大得多之前,实际上不会达到OCaml施加的限制。直到那时,
Sys.max\u array\u length
值才引起人们的兴趣。唯一有趣的限制是您使用的系统强加的限制

更新2

我不知道这是否有帮助,但下面是
Sys.max\u array\u length
的代码:

let max_array_length = (1 lsl (word_size - 10)) - 1

注意,它根据机器的字长返回一个常量值。它在所有64位机器上总是返回相同的值,对于确定在特定情况下特定进程的可用空间是毫无用处的。

谢谢,那么对于长度可变的字符串,它是如何工作的呢?它是否在内部存储指向字符串的“指针”?还是使用传入Array.make的初始元素的大小来确定需要多少空间。另一个问题是,我甚至无法生成大小为10亿的数组。
Sys.max\u string\u length
值以完全相同的方式过度渲染。我不认为OCaml字符串表示法与这个问题有多大关系,但它在OCaml手册的第二部分中有详细说明。哦,我的意思是,如果我想要一个字符串数组,它怎么知道字符串数组有多大?因为该值只是一个上限,对于64位系统上的所有数组类型,该值都是相同的。在32位系统上,浮点数组的限制更小。(我只是在手册中读到了这一点。)但该值并不能告诉您在特定系统的特定环境中,特定阵列可以有多大。这只是OCaml数据表示强加的上限。啊,我现在理解了这一部分,我可能没有抓住要点,因为我似乎甚至无法生成10亿大小的数组。我认为这只需要80亿字节,这应该是可能的。内存不足消息表明情况并非如此。