数字を含む非常に長いファイルがあります。この perl プログラムの出力のようなもの:
perl -le 'print int(rand() * 1000000) for 1..10'
しかし、もっと長い - 約数百ギガバイト。
このファイルを他の多くのファイルに分割する必要があります。テストの目的で、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 は明らかにファイル ハンドルをリサイクルするほどスマートなので、これは通常のファイル出力では壊れません。
そのような場合を処理する方法を(私自身のストリーム分割プログラムの作成、バッファリングの実装、およびある種のファイルハンドル管理を除いて)知っていますか?つまり、複数のファイルに分割し、出力ファイルへのアクセスはランダムで、その場ですべての出力パーティションをgzipしますか?