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

Data structures 将大型数据集摘要写入磁盘,data-structures,file-io,tree,dataset,Data Structures,File Io,Tree,Dataset,我有一个很大的数据集,从中我得到了一组不同粗糙程度的层次总结。我想将这些摘要缓存在磁盘上的一个文件中,每个摘要都可以通过其偏移量从文件中检索。初始摘要是通过从初始数据集中获取小数据块(约256字节)并从每个数据块中提取最大值得出的。然后,通过取前一个摘要中每对值的最大值,导出后续摘要。以下(初步)说明有望澄清: 251 18 5 91 11 17 54 16 9 31 201 148 173 214 66 43 ;;Initial data-set (chunked) 251

我有一个很大的数据集,从中我得到了一组不同粗糙程度的层次总结。我想将这些摘要缓存在磁盘上的一个文件中,每个摘要都可以通过其偏移量从文件中检索。初始摘要是通过从初始数据集中获取小数据块(约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级。速度不是一个特别的问题,但空间是:因为对于这种大小的数据集,即使摘要也可能太大而无法在内存中处理。我一直在尝试多种方法:

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

  • 以块计算每个层-计算第一层的块,然后计算第二层,然后计算第三层,依此类推,最后以适当的偏移量将块写入文件并重新启动进程。问题是,由于每个区块的大小都是计算区块大小的一半,因此在计算所有层之前,我们会得到一个0区块大小

  • 为每个摘要使用单个文件

  • 使用某种基于树的方法(上图——如果打开它的头部——类似于堆)。也许树中的每个节点可能代表,比如说,每个层中1024字节的块。父节点将有两个子节点,表示前一层中的连续块,其内容将从这些子节点计算。完成后,子节点可以简单地刷新到磁盘。我怀疑这个过程完全可以在内存中完成(尽管我不知道它的复杂性是什么)

  • 非常欢迎您的想法/意见


    Christopher

    好的,经过进一步的研究,我最终选择了B-树,最上面的几层缓存在主内存中。现在可以工作了

    克里斯