我需要对我的 Linux 命令进行一些速度测试。输入数据是单词列表。例如:
$ cat list
elephant
horse
raven
cat
dog
fish
为了进行合理的速度测试,我需要有一个更大的文件。重复上述列表数十万次的最快方法是什么?
我需要对我的 Linux 命令进行一些速度测试。输入数据是单词列表。例如:
$ cat list
elephant
horse
raven
cat
dog
fish
为了进行合理的速度测试,我需要有一个更大的文件。重复上述列表数十万次的最快方法是什么?
jot
是一个通常在 BSD 系统(包括 macOS)上默认安装的工具,但也可以安装在大多数 Linux 系统上。例如,Ubuntu 上的软件包称为athena-jot
.通过一些
head
实现:list
将为您提供价值 1GiB 的无限重复内容。使用 ksh/zsh/bash,您可以替换
"$(cat list)"
为"$(<list)"
.-c
不是 的标准选项head
,并且并非所有支持它的实现都支持那些 KMGTPE... 后缀。另请注意,它可能会在中间切断一条线并使其不定界。打印
1000000
行数将是标准且可移植的。这是一种方法,使用 perl:
该
-g
标志指示perl
立即读取整个文件并执行-e
其上给出的脚本。脚本本身仅使用<>
表示标准输入的特殊 perl 语法,然后我们打印@list
乘以 10。在您的输入上,为x 3
简单起见,给出:所以如果你想要数千,只需做类似的事情
在我的系统上,不到 5 秒就创建了一个 3.2G 的文件:
反复加倍。此代码非常高效,因为它仅循环log 2 n次,文件大小就会增加n倍。(1 次迭代为两倍大小,2 次迭代为四倍大小,等等)
这将为您提供一个乘法因子 131072 (2 17 ),这符合您“重复上述列表数十万次”的要求。
您可以
cat a a a a
改为加 4 9,通过 9 次迭代实现乘法因子 262144。该
{1..17}
构造是由不太简约的 shell 支持的大括号扩展,例如ksh
,bash
,zsh
(但不是dash
或 POSIX)由于您不关心重复次数,因此您可以结合“超时”和“是”命令来非常快速地创建大量重复。例如:
更改 0.01 秒的时间参数以满足您的需要。保持较低的值,即使只有 1 秒,您也可能会得到 5000 万行!
只需使用 for 循环:
这基本上将给定列表时间的初始内容附加
n
到同一文件中。调整limit
并file
使其按照您想要的方式工作。如果列表的实际内容并不重要,您可以做一些更灵活的事情,只需将任意字符串附加到文件中,如下所示:
或者直接从命令行使用更简洁的语法:
编辑:感谢@muru 的建议。当然,在每次迭代中进行重定向并不高效,在 for 循环之后立即附加生成的内容会更好更快。我已相应更新了答案。
更新
如果考虑效率并且需要更具可扩展性的解决方案,您可以使用外部命令
seq
并shuf
生成所需大小的随机列表:为了更清楚地看到差异,让我们将迭代次数增加到 1,000,000 次并测量时间:
这比使用 运行 for 循环快了近 40 倍
$RANDOM
,而在我的机器上使用相同的 运行 for 循环则花费了 5.935 秒limit
。