将大型数据集摘要写入磁盘

时间:2011-06-12 21:52:03

标签: data-structures file-io tree dataset

我有一个大型数据集,我可以从中获得不同粗略级别的层次结构摘要。我想将这些摘要缓存在磁盘上的文件中,每个摘要都可以通过其偏移量从文件中检索。通过从初始数据集中获取小块(c.256字节)并从每个块中提取最大值来导出初始摘要。然后通过获取前面摘要中每对值的最大值来导出后续摘要。以下(基本)插图有望澄清:

251 18 5 91  11 17 54 16  9 31 201 148  173 214 66 43   ;;Initial data-set (chunked)

    251           54          201            214        ;;Summary 0

           251                        214               ;;Summary 1

                         251                            ;;Summary 2

我正在尝试实现的是一种导出(然后缓存)这些摘要的方法,这些摘要可以扩展到大型数据集,例如大约4GB。速度不是特别的问题,但空间是:因为对于那个大小的数据集,即使摘要可能太大而无法在内存中处理。我一直在试验一些方法:

  1. 天真的方法是简单地完整地写出每一层然后再读回来计算下一层。这显然是最简单的方法,但它似乎并不是最优雅或最有效的。内存映射可能会提供一些改进,但这也可能意味着我需要事先预先分配文件。

  2. 以块为单位计算每一层 - 计算第一层的块,然后计算第二层,然后计算第三层,依此类推,最后将块以适当的偏移量写入文件并重新启动该过程。这样做的问题在于,由于每个块的大小都是计算它的块的一半,因此在计算所有层之前,我们将得到0块大小。

  3. 为每个摘要使用单个文件。

  4. 使用某种基于树的方法(上图 - 如果转过头 - 就像一堆)。也许树中的每个节点可能代表每层中1024字节的块。父节点将具有两个子节点,表示前一层中的连续块,并且其内容将从这些子节点计算。完成此操作后,可以简单地将子节点刷新到磁盘。我怀疑这个过程可以完全在内存中完成(虽然我不知道它的复杂性可能是什么)。

  5. 最受欢迎的观点/观察。

    克里斯托弗

1 个答案:

答案 0 :(得分:1)

好的,经过一番研究后,我最终选择了B-Tree,其中前几个级别缓存在主内存中。现在可以使用。

克里斯