gpt4 book ai didi

shell - 将压缩的 csv 分割成 block 的最有效方法

转载 作者:行者123 更新时间:2023-12-03 00:27:29 26 4
gpt4 key购买 nike

我有一些非常大的 gzip 压缩 csv 文件(mysqldump 的压缩输出)——每个文件大约 65 GB。

我需要将它们分成压缩 block ,每个压缩 block 小于 4 GB(压缩后),请记住每个 csv 文件中都存在引用的换行符。

在 'nix 命令行(例如在 Debian 中)上执行此操作的最有效方法是什么?

与此类似SO尽管响应没有正确考虑引用的换行符。

最佳答案

一种不使用临时磁盘空间的方法。

block 大小估计

首先,由于每行的压缩率根据其内容而变化,因此很难获得精确的压缩后大小目标,除非运行 2-pass 编码。但是,您可以使用以下命令粗略估计压缩前 block 的大小:

gzip -l file.csv.gz | tail -1 | awk '{print int(4*$2/$1)}'

此命令中的4(GB)是压缩后每个 block 的目标大小,因此如果结果显示21,则意味着您可以拆分未压缩的 block 文件的 block 大小大约为 21(GB),假设该文件具有均匀的熵分布。

解压缩、分割和压缩

我们可以使用上面获得的 block 大小来分割文件

gzip -dc file.csv.gz | split -C 21G -d - split_ --filter='gzip > $FILE.csv.gz'
  • gzip -dc 将文件解压到 stdout
  • split -C 21G 每个输出文件最多放置 21G 记录
  • split --filter='gzip > $FILE.csv.gz' 启用对每个拆分文件的直接压缩

额外提示:将上面的所有 gzip 替换为 pigz 以启用更快的多线程压缩

更新

要保留每个分割的 gzip 压缩文件的 header ,我们可以使用

gzip -dc file.csv.gz | tail -n+2 | split - --filter='{ gzip -dc file.csv.gz | head -1; cat; } | gzip > $FILE.csv.gz'

为了简单起见,这里忽略了 split 的一些选项,但您明白了。诀窍是修改 split 中的过滤器选项,以便它将原始 csv 文件中的 header 添加到每个拆分文件的输出流中。

关于shell - 将压缩的 csv 分割成 block 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47062749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com