大容量CSVファイル(90 GB)をソート中にディスククォータを超えました。

大容量CSVファイル(90 GB)をソート中にディスククォータを超えました。

これが私が今やっていることです。

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

ファイルサイズは90 GBですが、このエラーメッセージが表示されます。

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

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

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

ベストアンサー1

問題は、ディスククォータを設定したようですが、ユーザーがあまりにも多くのスペースを占有する権限がないことです/some_dir。いいえ、この--parallelオプションはこれには影響しません。

回避策として、ファイルを小さなファイルに分割し、各ファイルを別々に並べ替えてから、単一のファイルに再びマージすることができます。

## 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

魔法は-mGNUソートオプションです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億チャンクだけでソートされるため、多くのスペースを占有しません。

おすすめ記事