RHEL7;将文件并行分割成相等的部分

RHEL7;将文件并行分割成相等的部分

是否可以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.tar10GB)的经验,可能会出现延迟分钟由于首次访问文件时的磁盘 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 个部分并并行处理它们。

相关内容