我一直在工作上的问题,我认为人们可能会找到有趣的(也许有人知道还有一个预先存在的解决方案)。

我有一个大数据集组成的一个长长的清单对指针的对象,事情是这样的:

[
  (a8576, b3295), 
  (a7856, b2365), 
  (a3566, b5464),
  ...
]

有太多的对象保持存在任何一个时间(可能数以百计的千兆字节),因此它们需要储存在磁盘中,但是可以缓存在存储器(可能使用LRU缓冲存储)。

我需要运行,通过这个清单处理的每一个对,要求这两个对象在对被载入存储器(如果他们不是已经缓存里).

因此,问题:有没有办法重新排序对清单的效能最大化的一个高速缓冲存储器(换句话说:最大程度地减少缓错过)?

注意到

  1. 显然,重新排序的算法应该以最快的速度成为可能,并且不应该取决于是否能够有整个列表中的存在,一旦(因为我们没有足够的内为此),但它可以迭代表几次,如果有必要的。

  2. 如果我们处理与各个对象,不对,然后简单的答案将对它们进行排序。这显然不会的工作,在这种情况,因为需要考虑的两个因素在对。

  3. 该问题可能是相关的,找到一个 最低图切, 但即使如果问题是相当,我不认为解决方案,分割满足

  4. 我的假设是,启发式会流的数据的磁盘上,并写在块在一个更好的秩序。它可能需要迭代过这几次。

  5. 实际上它可能不只是对的,它可能是三胞胎、四胞胎,或者更多。我希望,这一个算法,这不会对可以很容易地推广。

有帮助吗?

解决方案

你的问题是关系到一个类似于计算机图形硬件:

当呈现索引的顶点,在一个三角形的网格,通常所的硬件已经缓的最近转折点(~128最后一次我不得不要担心它,但是嫌疑犯的数目是更大的这些天)。顶点不高速缓存需要一个相对较昂贵的转换操作计算。"网优化"重组三角形的网格,以优化使用缓存用于是一个非常热门的研究课题。谷歌上搜索 顶点快优化 (或优化:^)可能会发现你一些有趣的材料相关的问题。其他的海报的建议,我怀疑这样做的有效将取决于利用任何固有的一致性,在你的数据。

另一件事,要记住:作为一个LRU高速缓冲存储器变得超载它可能是好的价值变为一个MRU更换战略,以至少举行一些项目在内存(而不是把整个缓存每个通过)。我似乎记得约翰*卡马克写了一些很好的材料对这个问题与Direct3D纹理缓存战略。

其他提示

开始,你可以 mmap 该清单。这一工作,如果有足够的地址空间,并不存储器,例如64位Cpu。这使它更容易访问的要素,以便。

你可以列出根据最低距离高速缓存这认为这两个要素,其工作以及如果对象是在一个连续的空间。排序功能可能是这样的:比较(a、b)到(c,d)=(a-c)+(b d)(其看起来像一个Hamming distance)。然后你拉在片的对象存储和处理根据的列表。

编辑:固定了一个错误,在该距离。

即使你不是 只是 排序这个列表中,一般模式的一个 多向合并排序 可能适用的--即,考虑某一种类的(可能是递归)分列的组成小组,以处理的记忆分开,然后第二阶段的小块之前处理-有设置都是可以结合在一起。甚至不知道具体性质是什么你做的对,这是可以安全地说,许多算问题作出更直接的,当你处理排序的数据(包括图表问题,这可能是你有你手上的这里)。

我认为这个问题的答案将取决于非常严重的完全接入模式对的对象。正如你说的,只是排序的指针将是最好的一个简单的、非配情况。在更复杂的情况下,它可能仍然是有意义的排序通过的一半的对如果是这样的地区对这些价值观更为重要的(例如,如果这些都是关键值对你都做了大量的搜索,地方键是无比重要的比值)。

所以,真的,我的回答是,这个问题不能回答了在一般情况。

用于储存的结构,什么你实际上想可能是 B-树.这些都是专为你在说什么--跟踪的大型集合在那里你不想(或不可能)保持整个事情中的存储器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top