1

数字を含む非常に長いファイルがあります。この 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しますか?

4

1 に答える 1