【问题标题】:Reading a gzip file backwards向后读取 gzip 文件
【发布时间】:2013-11-15 18:33:32
【问题描述】:

我想了解在不将整个文件的内容加载到内存中的情况下,反向读取 gzip 文件的最有效(速度和性能)方法是什么。

这是我目前所做的,但对于非常大的文件效率不高:

file = 'huge_file.log.gz'
import gzip
if file.endswith('gz'):
    f = gzip.open(file)
    # reverse the file contents
    reverse_file_list = reversed(f.read().decode('utf-8').split('\n'))

我看到在 stackoverflow 和 codestate 中有一些解决方案可以进行负搜索,但是当文件以二进制模式打开时不支持负搜索,例如 gzip.open

链接: Most efficient way to search the last x lines of a file in python

http://code.activestate.com/recipes/439045/

因此,我想要完成的解决方案失败了。

【问题讨论】:

    标签: python gzip


    【解决方案1】:

    确实没有什么好办法。 gzip (deflate) 压缩数据格式在使用霍夫曼编码和使用之前 32K 的匹配字符串时本质上是串行的。

    如果您无法将其全部放入内存,则需要 a) 将其解压缩到磁盘,然后在未压缩的形式上使用 seek 将其反转,或者 b) 对 gzip 文件进行一次解压传递,从而有效地创建随机访问足够小以保留在内存中的块的入口点,然后向后执行第二次解压缩传递,反转每个块。

    a) 可以使用 tac 完成,正如@Jud 的回答中所建议的那样,因为 tac 会在磁盘上创建一个临时文件来保存未压缩的内容。

    b) 很复杂,需要对 deflate 格式有深入的了解。它还要求您在内存或磁盘中为每个入口点保存 32K 的历史记录。

    【讨论】:

      【解决方案2】:

      唯一的解决方案可能是将文件解压缩到磁盘并颠倒行序。它使用两倍的磁盘空间,但不是内存。

      您可以同时完成这两个步骤:

      gzip -cd huge_file.log.gz | tac > huge_file.log.reversed
      

      然后就可以正常读取和处理了。

      【讨论】:

        【解决方案3】:

        不幸的是,您必须从头开始解析 gz 文件,并且将它们全部解析到最后可能会很耗时。我使用列表缓冲区,如果 reverse=True 并且已达到 BSIZE,它只会弹出第一项,它将始终保存文件的最后一个 BSIZE 匹配项,并且一次通过:

           BSIZE = 100; searchstr= "match in gzfile"; n = 0; buffer = []; reversed = True
           # gzf is an *.gz file in a directory
           with gzip.open(files['path'] + '/' + gzf, 'rt') as f:
                for line in f:
                    if re.search(searchstr, line):
                        n += 1
                        buffer.append(line.strip())
                        if n >= BSIZE and not reversed:
                            break
                        elif n >= BSIZE:
                            buffer.pop(0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 2011-03-21
          相关资源
          最近更新 更多