我有一个很大的文件,用gzip压缩在磁盘上。生产环境是基于“云”的,因此存储性能很差,但是CPU很好。以前,我们的数据处理管道以gzip -dc从磁盘流式传输数据开始。

现在,为了使工作并行化,我想运行多个流水线,每个流水线使用一对字节偏移量(开始和结束),并占用文件的该块。对于普通文件,可以使用headtail来实现,但是我不确定如何使用压缩文件有效地完成此操作。如果我使用gzip -dc并通过管道传递到head,那么在文件末尾的偏移量对将涉及在缓慢解压缩时浪费地搜索整个文件。

所以我的问题确实是关于gzip算法的-理论上是否有可能在基础文件中寻找字节偏移量或获取其中的任意块,而没有将整个文件解压缩到那时的全部含义?如果不是,我如何才能有效地对文件进行分区以供多个进程进行“随机”访问,同时又将I / O吞吐量开销降至最低?

最佳答案

您不能使用gzip来做到这一点,但是可以使用bzip2来做到这一点,bzip2是基于块而不是基于流的-这就是Hadoop DFS如何在其MapReduce算法中拆分并并行化具有不同映射器的大型文件的读取。将文件重新压缩为bz2也许很有意义,这样您就可以利用它了。这比临时打包文件要容易得多。

我在Hadoop中找到了正在实现此功能的补丁:https://issues.apache.org/jira/browse/HADOOP-4012

这是该主题的另一篇文章:BZip2 file read in Hadoop

也许浏览Hadoop源代码可以使您了解如何按块读取bzip2文件。

关于unix - 随机访问压缩文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14225751/

10-10 13:58
查看更多