1

我有一个很长的数字文件。类似于这个 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 配置为允许打开的文件少于“分区”数时,awk 会中断:

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

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

您是否知道处理这种情况的任何方法(除了编写我自己的流拆分程序、实现缓冲和某种文件句柄池管理) - 即:拆分为多个文件,其中访问输出文件是随机,并即时压缩所有输出分区?

4

1 回答 1

1

我没有写它本身有问题,但由于附加信息与解决方案一起,我将在这里全部写下来。

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

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

export LD_PRELOAD_32=/usr/lib/extendedFILE.so.1
于 2013-04-09T19:35:58.407 回答