对大型 CSV 文件 (90GB) 进行排序,超出磁盘配额

对大型 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 目录不够大,无法处理这个问题。我当前的目录有大约 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

神奇的是 GNU sort 的-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 的可用空间,以便存储所有部分。然而,实际排序不会占用那么多空间,因为您只会按 100M 块进行排序。

相关内容