【问题标题】:How to merge sorted files without using a temporary file?如何在不使用临时文件的情况下合并排序文件?
【发布时间】:2011-07-06 15:02:21
【问题描述】:

我正在尝试将 UNIX/Linux 脚本中的许多已排序文件与 sort -m 合并,我注意到 sort 首先将结果写入临时文件,然后将其复制到目标。我对-m 的理解是它假定文件已排序,因此完全没有必要使用临时文件,而且它会浪费硬盘空间和 CPU 周期(我在管道中使用 sort 时会卡住等待排序输出任何东西。)有没有办法告诉sort在合并排序文件时不要使用临时文件?还是没有更好的版本?

确切的 CL 如下所示:

$ sort -m -s -t '_' -k 1,1n -k 2,2n <(gunzip <file_1) [...] <(gunzip <file_n) | gzip >output

我正在使用来自 GNU coreutils 5.97 的 sort

【问题讨论】:

  • 我认为因为sort 是作为通用实用程序编写的,所以他们不认为您的情况会增加程序的复杂性,因此依赖于 tmp 文件的 std 排序机制。 ....编写一个 awk 脚本来循环输入文件列表,比较每一行,从一个文件中打印“最低”值,从该文件中获取下一条记录,然后比较所有再次记录,希望打印下一个“最低”记录。您可能会遇到打开文件的系统限制,但这对于您编写的任何解决方案都是如此。首先测试4。祝你好运

标签: unix sorting command-line temporary-files


【解决方案1】:

查看man sort 中的这些选项,它们可以让您最大限度地减少合并所需的空间量。

--batch-size=NMERGE  

一次合并最多 NMERGE 输入;更多使用临时文件

--compress-program=PROG 

用 PROG 压缩临时文件;用 PROG -d 解压缩它们

【讨论】:

  • 这不是问题的解决方案,因为它被问到如何防止临时文件,以及为什么需要临时文件?您的回答有助于减少临时文件,但不会阻止它们。对于大文件,它仍然使用临时文件
  • 它确实解决了问题。您必须将--batch-size 设置为高于要合并的文件数。我有 31 个文件要合并,并且没有指定它开始使用临时文件的选项。设置--batch-size=31 时,它会立即开始写入输出,而无需临时文件。
  • 我成功地使用了 --batch-size=520 来合并那么多大的排序文件;没有这个选项,它非常慢
  • 在 MS Windows 上,我只能访问像 sort.exe 这样的非 GNU Unix。我可以通过找出 sort -m 何时使用临时文件(这是使用 6 个或更多文件)来加快我的排序,然后实现从列表中获取 5 个文件的脚本(没有临时文件的合并),合并它们并将结果文件回到列表的末尾并继续,直到我剩下一个文件。这也减少了许多小时的交货时间。 (必须合并 4000 个文件,总大小为 6GB)。
【解决方案2】:

使用 GNU coreutils 6.10 运行,我没有看到这个问题。

关于您正在使用的命令行的一件事是

我运行了这个命令:

sort -m a b c d e f g h i j | more

它没有为输出创建临时文件。我将输出通过管道传输到 more 以便它会阻塞,然后查看 /proc 以查看排序在做什么。它打开了所有输入文件,并打开了更多命令的管道,但仅此而已。没有临时文件:

$ ls -l /proc/1308/fd
total 0
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 0 -> /dev/pts/0
l-wx------ 1 brianb brianb 64 2014-06-24 18:50 1 -> pipe:[217016034]
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 10 -> /home/brianb/h
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 11 -> /home/brianb/i
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 12 -> /home/brianb/j
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 2 -> /dev/pts/0
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 3 -> /home/brianb/a
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 4 -> /home/brianb/b
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 5 -> /home/brianb/c
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 6 -> /home/brianb/d
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 7 -> /home/brianb/e
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 8 -> /home/brianb/f
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 9 -> /home/brianb/g

【讨论】:

    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多