代码之家  ›  专栏  ›  技术社区  ›  RightmireM

逐行写入gzip文件

  •  0
  • RightmireM  · 技术社区  · 7 年前

    我正在处理大数据(数百万行)。

    我有一个COTS脚本来生成这些行,我需要根据内容将这些行注释到不同的文件中。由于文件的大小为纯文本,所以如果数据可以直接以gzip格式写入,这将非常理想。

    即。

    line_generator | while read line; do
      [[ $line =~ .*0/0.* ]] && { echo "${#line}," | gzip -9 >> REF.out.gz ; }
      [[ $line =~ .*0/1.* ]] && { echo "${line}" | gzip -9 >> MAT.out.gz ; }
      [[ $line =~ .*1/0.* ]] && { echo "${line} | sed 's/X/y/g'" | gzip -9 >> MAT.out.gz ; }
    done
    

    同样,由于文件大小和行数非常大,我不确定是否可以先在内存中构建文件,然后再转储到GZIP'ped文件。

    1 回复  |  直到 7 年前
        1
  •  1
  •   ilkkachu CesarB    7 年前

    你在复印一份 gzip 每一条线单独安装。这不是一个好主意,因为它很慢,压缩也会受到影响,因为所有行都被压缩为独立的块。对于短线,结果可能比未压缩版本长。。。

    但是,你可以使用一次打开管道 exec process substitution redirections 在shell过程中进行)。例如:

    #!/bin/bash
    exec 3> >(gzip -9 >> odd.out.gz)
    exec 4> >(gzip -9 >> even.out.gz)
    
    seq 1 1000 | while read x ; do 
            [[ $x =~ [13579]$ ]] && echo "$x" >&3
            [[ $x =~ [02468]$ ]] && echo "$x" >&4
    done 
    # close the pipes when you're done
    exec 3>&-
    exec 4>&-