Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List ocaml超大数据结构建议_List_Data Structures_Ocaml_Large Data - Fatal编程技术网

List ocaml超大数据结构建议

List ocaml超大数据结构建议,list,data-structures,ocaml,large-data,List,Data Structures,Ocaml,Large Data,我正在寻找关于在OCaml中使用什么样的数据结构来处理规模非常大的结构的建议 按比例来说,我不希望堆栈溢出,也不希望堆呈指数级增长,前提是有足够的内存。因此,这几乎消除了标准库的List.map函数。速度不是什么大问题 但是对于初学者,让我们假设我在2^10-2^100个项目的领域中操作 我在结构上只执行三个“操作”: (1) 结构子集上的映射函数,它增加或减少结构 (2) 扫描结构 (3) 删除结构中满足特定标准的特定项对 最初我使用的是常规列表,这仍然是非常理想的,因为结构在不断变化。通常,

我正在寻找关于在OCaml中使用什么样的数据结构来处理规模非常大的结构的建议

按比例来说,我不希望堆栈溢出,也不希望堆呈指数级增长,前提是有足够的内存。因此,这几乎消除了标准库的List.map函数。速度不是什么大问题

但是对于初学者,让我们假设我在2^10-2^100个项目的领域中操作

我在结构上只执行三个“操作”:

(1) 结构子集上的映射函数,它增加或减少结构

(2) 扫描结构

(3) 删除结构中满足特定标准的特定项对

最初我使用的是常规列表,这仍然是非常理想的,因为结构在不断变化。通常,在执行所有操作后,结构的大小最多会增加一倍(或大约两倍),或者减少到空列表[]。也许从一开始,加倍就注定了我的命运,但这是不可避免的

在任何情况下,大约2^15--2^40项开始导致严重的问题(可能是由于我使用的简单列表函数)。该程序使用100%的cpu,但几乎没有内存,通常在一两天后它会出现堆栈溢出

如果可能的话,我宁愿开始使用更多的内存,以便继续在更大的空间中运行


无论如何,如果有人有任何建议,我们将不胜感激。

如果理论上您有足够的空间来容纳数据结构的所有项,那么您应该考虑具有高效内存表示形式的数据结构,并且尽可能少的簿记。动态数组(当需要更多空间时按指数调整大小)的存储效率比列表(用一个完整的字来存储每个单元格的尾部)高,因此在相同的内存使用情况下,可以得到大约两倍的元素

如果您不能在内存中保存所有元素(这是您的数字的外观),则应该使用更抽象的表示。如果没有关于元素的更多信息,很难说出更多。但也许一个抽象表达的例子可以帮助你设计出你需要的东西

假设我想要记录一组整数。我想创建并集,这些集合的交集,还有一些更时髦的操作,比如“获取所有多个元素”。我希望能够对非常大的集合(无数不同的整数)这样做,然后我希望能够在我构建的集合中选择一个元素,任意一个。我能做的不是试图存储整数列表、整数集或布尔数组,而是存储与这些集合的定义相对应的逻辑公式:一组整数
P
的特征是公式
F
,从而
F(n)⇔ N∈P
。因此,我可以定义一种类型的谓词(条件):

存储这些公式需要很少的内存(与我想要应用的操作总数成比例)。构建交叉点或联合体需要固定的时间。然后我要做一些工作来找到一个满足公式的元素;基本上,我必须对这些公式的含义进行推理,从中得到一个标准形式(它们都是“满足某些模准则的区间有限并集的元素”),并从中提取一些元素


在一般情况下,当您在数据集上获得“命令”时,例如“添加此子集上的映射结果”,您总是可以将其存储为数据(结构的定义),而不是实际评估此命令。您越能准确地描述这些命令(例如,您说“map”,但存储(elem->elem)函数将不允许您轻松地对结果进行推理,也许您可以将该映射操作表述为操作的具体组合),您就越能准确地在这个抽象级别处理它们,没有实际计算元素。

不确定“足够的内存”是什么意思。2^100等于10^30。如果每个“项”只有1位,你仍然在说1250万亿兆兆字节。在那一点上,甚至更早的时候,你可能需要做一个懒散的列表或序列,显然不能将整个结构存储在内存中。但我不知道该用什么,这就是我为什么要问的原因。确实非常大:2^100是10^30,2^10000是10^3000。为了便于比较,宇宙中大约有10^24颗恒星和10^80个原子。你确定这些数字吗?是的,谢谢你的观察和评论。当我回到家时,我意识到它们太大了——这些数字来自退化的二叉树,它们的最大尺寸是这些。我已经删除了那些大得离谱的数字,所以现在我们可以继续2^15及以后的例子,这样我们就有希望得到建设性的意见,说明对于那些大但小于可见宇宙中恒星数量的结构,应该使用什么样的OCaml数据结构;)虽然不幸的是,我一直在做一些计算,我认为结构在从2^p->2^(2*p-2)操作后会扩展…好的,首先,很抱歉延迟,突然变得非常繁忙。无论如何,我不确定我是否完全理解你的答案,但我会检查它,因为它是唯一的一个,而且这个线程似乎已经死了。基本上,基础数据结构是需要完全相乘的二叉树形式的带时间的算术表达式,即:(x1+x2+x3)*(x3+x4+x5)。出于我不想深入讨论的原因,当时间尽可能地在树中向下推时,上述内容被认为是最简单的形式。@mbunit:那么您的大数据结构就是这些算术表达式之一,只是非常大?我不明白你的概念,比如说,在这种情况下,“删除特定的一对项目”是什么
type predicate =
  | Segment of int * int   (* n ∈ [a;b] *)
  | Inter of predicate * predicate
  | Union of predicate * predicate
  | Multiple of int  (* n mod a = 0 *)