我有一个很长的文件和数字。像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显然足够智能,可以回收文件句柄。
你知道吗(除了编写我自己的流分裂程序,实现缓冲和某种文件池管理)以处理这种情况 - 即:拆分为多个文件,访问输出文件是随机的,并且动态地压缩所有输出分区?
答案 0 :(得分:1)
我本身并没有提问,但由于附加信息与解决方案一起,我会在这里写下来。
所以 - 问题发生在Solaris上。显然有一个限制,在Solaris上使用stdio的程序不能有超过256个打开的文件句柄吗?!
详细描述in here。重要的一点是,在运行我的有问题的程序之前设置一个env变量就足够了,问题就消失了:
export LD_PRELOAD_32=/usr/lib/extendedFILE.so.1