在Linux中对文件中的行进行随机播放的最快方法

alp*_*cod 16 unix linux bash

我想在Linux中随机播放一个包含数百万行字符串的大文件.我试过'sort -R'但它很慢(16M大文件需要50分钟).是否有更快的实用程序,我可以使用它代替它?

dsh*_*erd 27

使用shuf而不是sort -R(手册页).

进展缓慢sort -R原因可能是其散列每一行.shuf只做一个随机排列,所以它没有那个问题.

(这是在评论中提出的,但由于某种原因没有被任何人写成答案)

  • 根据对该主题的评论/sf/ask/62036621/` shuf`将所有内容加载到内存中,因此任何文件太大而无法加载到内存中都会失败.这不是一个_problem_本身,但如果你试图用合法的大文件做这件事,那就是一个问题. (3认同)

小智 4

根据您的描述,50 分钟不是由实际排序机制引起的。时间可能花在等待/dev/random产生足够的熵上。

一种方法是使用外部随机数据源(例如http://random.org )以及Schwartzian 变换的变体。施瓦茨变换将要排序的数据转换为嵌入排序键的“丰富”数据。使用键对数据进行排序,然后丢弃键。

要将其应用于您的问题:

  • 生成一个带有随机数的文本文件,每行 1 个,行数与要排序的文件相同。这可以随时完成,在后台运行,在不同的服务器上运行,从 random.org 下载等。重点是,当您尝试排序时,不会生成这种随机性。

  • 使用以下命令创建文件的丰富版本paste

    paste random_number_file.txt string_data.txt > tmp_string_data.txt

  • 对该文件进行排序:

    sort tmp_string_data.txt > sorted_tmp_string_data.txt

  • 删除随机数据:

    cut -f2- sorted_tmp_string_data.txt > random_string_data.txt

这是基本思想。我尝试了一下,确实有效,但是我没有 1600 万行文本,也没有 1600 万行随机数。您可能希望将其中一些步骤流水线化,而不是将其全部保存到磁盘。