我想在Linux中随机播放一个包含数百万行字符串的大文件.我试过'sort -R'但它很慢(16M大文件需要50分钟).是否有更快的实用程序,我可以使用它代替它?
dsh*_*erd 27
使用shuf
而不是sort -R
(手册页).
进展缓慢sort -R
的原因可能是其散列每一行.shuf
只做一个随机排列,所以它没有那个问题.
(这是在评论中提出的,但由于某种原因没有被任何人写成答案)
小智 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 万行随机数。您可能希望将其中一些步骤流水线化,而不是将其全部保存到磁盘。