unix排序所需的磁盘空间

时间:2016-08-10 15:07:59

标签: sorting unix diskspace temp bigdata

我目前正在对500GB文本文件进行UNIX排序(通过Windows机器上的GitBash)。由于主磁盘空间不足,我使用-T选项将临时文件定向到磁盘,我有足够的空间容纳整个文件。问题是,我一直在看磁盘空间,显然临时文件已经超过了原始文件。我不知道会有多远,但我想知道是否有一条规则可以预测临时文件需要多少空间。

1 个答案:

答案 0 :(得分:1)

我按照this unix.SE answer中的说明手动批量处理。

查找一些非常基本的查询,将您的内容划分为足够小以便排序的块。例如,如果它是单词文件,您可以创建grep ^a …grep ^b …等查询。有些项目可能需要比其他项目更细粒度。

您可以编写如下脚本:

#!/bin/bash
for char1 in other {0..9} {a..z}; do
  out="/tmp/sort.$char1.xz"
  echo "Extracting lines starting with '$char1'"
  if [ "$char1" = "other" ]; then char1='[^a-z0-9]'; fi
  grep -i "^$char1" *.txt |xz -c0 > "$out"
  unxz -c "$out" |sort -u >> output.txt || exit 1
  rm "$out"
done
echo "It worked"

我使用xz -0,因为它几乎与gzip的默认gzip -6一样快,但它在保存空间方面要好得多。我在最终输出中省略了它以保留sort -u的退出值,但您可以使用大小检查(iirc,排序失败,输出为零),然后使用sort -u |xz -c0 >> output.txt.xz,因为xz(和gzip)容器可以连接档案(我之前也是written about that)。

这是有效的,因为每个grep运行的输出已经排序(01之前,在a之前,等等),所以最终的程序集不会被排序。我需要浏览sort(注意,"其他"部分会略有不同,因为一些非字母数字字符在数字之前,其他字符在数字和字母之间,其他字符仍然在之后你也可以删除grep的-i标志,另外迭代{A..Z}以区分大小写。显然,每个单独的迭代仍然需要进行排序,但希望它们可以管理。

如果程序在完成所有迭代之前退出并说"它工作"然后,您可以使用更加离散的批处理编辑脚本,以用于它尝试的最后一次迭代。删除所有先前的迭代,因为它们已成功保存在output.txt中。