web-dev-qa-db-ja.com

大きなCSVファイル(90GB)を並べ替え、ディスククォータを超えました

これが私が今していることです、

sort -T /some_dir/ --parallel=4 -uo file_sort.csv -k 1,3 file_unsort.csv

ファイルは90GBです、私はこのエラーメッセージを受け取りました

sort: close failed: /some_dir/sortmdWWn4: Disk quota exceeded

以前は-Tオプションを使用していませんでしたが、tmp dirはこれを処理するのに十分な大きさではありません。私の現在のディレクトリには、約200GBの空き容量があります。一時ファイルを並べ替えるにはまだ十分ではありませんか?

並列オプションが影響を与えるかどうかはわかりません。

7
Xuezhou Zhang

問題は、ディスククォータが設定されているようであり、ユーザーが/some_dirでそれほど多くの領域を使用する権利を持っていないことです。いいえ、--parallelオプションはこれに影響を与えないはずです。

回避策として、ファイルを小さなファイルに分割し、それぞれを個別に並べ替えてから、もう一度1つのファイルにマージすることができます。

## split the file into 100M pieces named fileChunkNNNN
split -b100M file fileChunk
## Sort each of the pieces and delete the unsorted one
for f in fileChunk*; do sort "$f" > "$f".sorted && rm "$f"; done
## merge the sorted files    
sort -T /some_dir/ --parallel=4 -muo file_sort.csv -k 1,3 fileChunk*.sorted

魔法はGNUソートの-mオプション(info sortから):

‘-m’
‘--merge’
    Merge the given files by sorting them as a group.  Each input file
    must always be individually sorted.  It always works to sort
    instead of merge; merging is provided because it is faster, in the
    case where it works.

それには、すべてのピースを保存するために、90Gファイル用に最大180Gの空き容量が必要になります。ただし、実際の並べ替えには、1億個のチャンクで並べ替えるだけなので、それほど多くのスペースは必要ありません。

5
terdon