是否可以split
使用GNU运行linux命令parallel
来加速文件的分割?
读取压缩文件,然后按行数或文件大小将其分成相等的部分。
我正在尝试如下:
zcat file.gz | parallel --pipe --block 2000M 'gzip > {#}.gz'
答案1
不会。首先,分割文件很可能是 IO 限制,而不是 CPU 限制,因此添加更多 CPU 来解决问题并没有帮助。
gzip 解压缩本身可以并行化 - 使用unpigz --stdout
而不是zcat
.但我再次怀疑这是否真的能显着加快速度,因为瓶颈是将数据写入文件。
分割管道本身的输出本质上是顺序过程,因此并行化没有意义,甚至在理论上也是不可能的。
所以,你能做的最快的事情就是
SIZE=10G # 10 GB output splits
unpigz --stdout | split -b ${SIZE} - outputfile_suffix_
1、事实上,减压不能实际上是并行化的——它本质上也是顺序的,但除了解压缩线程之外,校验和计算和 IO 处理是在单独的线程中完成的unpigz
,导致(通常)吞吐量略有增加。
答案2
您现在可以查看我更新的问题吗...我已经尝试过这种方法并且它似乎有点快
你可能正在观察磁盘缓存Linux 操作系统已经从其中读取了您的file.gz
信息磁盘这就是花费时间的事情;文件已经存储在 RAM 中,速度会快得多。从冷启动如果您登录后做的第一件事就是尝试分割文件,那么无论您如何执行此操作,似乎都会花费最长的时间 - 因为从冷启动尚未file
从磁盘读取然而。一旦你完成了这个或其他任何导致它file
从磁盘加载到 RAM 中的操作,那么对其进行的任何操作都会快得多。
这可能会让您感到困惑,具体取决于您的系统速度、RAM 数量(16GB、32GB、768GB)、文件大小以及磁盘类型。
根据使用较旧的 7200 rpm HDD 而不是 SSD 的服务器(大小为file.tar
10GB)的经验,可能会出现延迟分钟由于首次访问文件时的磁盘 I/O。
不,我认为您不能并行化 split coreutils 命令。
如果你的目标就是处理一些文件并让事情尽可能快地运行 -创建一个内存盘。
mkdir /scratch
mount -t tmpfs -o size=100g tmpfs /scratch
cp /from_wherever/file.gz /scratch
# this copy from disk to /scratch will be the initial time penalty.
# adjust size=?g accordingly, needs to be less than system ram
一旦到了内存盘后续操作将始终快速地。cp /scratch/your_output /back_to_wherever_on_disk
完成后,请意识到这是 RAM,并且会在重新启动时丢失。
答案3
如果您的文件尚未压缩:是。
parallel --pipepart -a bigfile --block 2G gzip '>{#}'
我有一种感觉,你稍后想要并行处理所有部分,在这种情况下,我建议你不要拆分bigfile
成临时文件,而只需直接使用 GNU Parallel 即可:
parallel --pipepart -a bigfile --block -1 myprocess data from stdin
它将bigfile
每个 CPU 核心分成 1 个部分并并行处理它们。