如何在java中对内存映射的压缩文件进行二进制搜索?

如何在java中对内存映射的压缩文件进行二进制搜索?,java,compression,nio,binary-search,Java,Compression,Nio,Binary Search,我有个问题,很接近 我想用java MappedBytebuffer实现对大文件中字符串的二进制搜索,但在我的例子中,大文件是用bzip2压缩的。假设文件是用-1选项100k块压缩的。(实际上我不知道确切的选项,但我可以重新打包文件) 我应该如何在这样的MappedByteBuffer中搜索字符串?如何解压1块?是否有一些标准库或我应该阅读标题、deflate部分和crc?这些块在压缩状态下是100k,还是100k,它是未压缩的数据长度?最后一个街区看起来怎么样 是否有人对压缩文件进行了二进制搜

我有个问题,很接近

我想用java MappedBytebuffer实现对大文件中字符串的二进制搜索,但在我的例子中,大文件是用bzip2压缩的。假设文件是用-1选项100k块压缩的。(实际上我不知道确切的选项,但我可以重新打包文件)

我应该如何在这样的MappedByteBuffer中搜索字符串?如何解压1块?是否有一些标准库或我应该阅读标题、deflate部分和crc?这些块在压缩状态下是100k,还是100k,它是未压缩的数据长度?最后一个街区看起来怎么样


是否有人对压缩文件进行了二进制搜索,可能不是使用Java?

您需要读取文件以获取每个块开始位置的索引。一旦你有了这个,你就可以对那些块进行二进制搜索。注意:如果您有一个底层记录或键,它可以被分割成多个块


更好的解决方案是自己构建压缩文件。将已知数量的记录写入一个块并分别压缩这些记录。此外,您还可以编写一个索引,说明每个块的起始位置以及该块的第一个键。这将允许您在不解压缩所有键的情况下找到正确的块,并且每次搜索只解压缩一个块而不是log2(n)个块。

Heh,我忘记了键可能位于两个块的边缘。看起来只有未压缩文件或自定义压缩选项。谢谢Peter。@user1904112您可以一次解压缩两个块,问题是如果您读取文件中的一个随机点,您可以扫描直到可靠地找到密钥吗?是的,我可以。但是,正如我所理解的,我应该按顺序扫描块,因为压缩块的长度是可变的。(正如我发现gzip/bzip默认情况下不添加块索引)并且定制打包仍然是最好的选择。无论如何,这是个坏主意。我早在20世纪70年代就研究过这个问题。对当时被描述为虚拟阵列的二进制搜索速度非常慢。一个合适的索引结构执行的速度比它快很多倍。在混合中增加压缩只会让情况变得更糟。