智能拆分文件与每个部分gzipping?

时间:2013-04-09 16:45:33

标签: bash awk split gzip

我有一个很长的文件和数字。像perl程序输出的东西:

perl -le 'print int(rand() * 1000000) for 1..10'

但更长 - 大约数百GB。

我需要将此文件拆分为许多其他文件。出于测试目的,我们假设通过将数字模块设为100来获取100个文件和输出文件编号。

使用普通文件,我只需使用:

即可
perl -le 'print int(rand() * 1000000) for 1..1000' | awk '{z=$1%100; print > z}'

但是当我需要压缩分割部件时,我遇到了问题。通常情况下,我可以:

... | awk '{z=$1%100; print | "gzip -c - > "z".txt.gz"}'

但是,当ulimit被配置为允许比“partition”数量更少的打开文件时,awk打破了:

awk: (FILENAME=- FNR=30) fatal: can't open pipe `gzip -c - > 60.txt.gz' for output (Too many open files)

这不会破坏正常的文件输出,因为GNU awk显然足够智能,可以回收文件句柄。

你知道吗(除了编写我自己的流分裂程序,实现缓冲和某种文件池管理)以处理这种情况 - 即:拆分为多个文件,访问输出文件是随机的,并且动态地压缩所有输出分区?

1 个答案:

答案 0 :(得分:1)

我本身并没有提问,但由于附加信息与解决方案一起,我会在这里写下来。

所以 - 问题发生在Solaris上。显然有一个限制,在Solaris上使用stdio的程序不能有超过256个打开的文件句柄吗?!

详细描述in here。重要的一点是,在运行我的有问题的程序之前设置一个env变量就足够了,问题就消失了:

export LD_PRELOAD_32=/usr/lib/extendedFILE.so.1