在bash的5000个目录中创建5000000000个空文件的最快方法
所以我需要在linux驱动器上创建5000000000个文件-空文件。实现这一目标的最快/最有效的方法是什么 我目前正在尝试的是:在bash的5000个目录中创建5000000000个空文件的最快方法,bash,loops,file,file-io,Bash,Loops,File,File Io,所以我需要在linux驱动器上创建5000000000个文件-空文件。实现这一目标的最快/最有效的方法是什么 我目前正在尝试的是: 用于/xfs/*/中的目录;do seq 1000000 | xargs-n1-I%bash-c'touch'$dir/file%';完成 这是“工作”,尽管速度很慢。(在5000个目录中创建1000000个文件) 有没有更好的方法来实现这一点?(没有进入参数列表太长问题) TIAtouch是一个外部程序,您必须启动5000000000次。您还运行了seq5000次
用于/xfs/*/中的目录;do seq 1000000 | xargs-n1-I%bash-c'touch'$dir/file%';完成代码>
这是“工作”,尽管速度很慢。(在5000个目录中创建1000000个文件)
有没有更好的方法来实现这一点?(没有进入参数列表太长问题)
TIAtouch
是一个外部程序,您必须启动5000000000次。您还运行了seq
5000次。两个都不要跑
for dir in /xfs/*/; do
for ((i=1; i <= 1000000; i++)); do
: > "$dir/file$i"
done
done
用于/xfs/*/中的目录;做
对于((i=1;i“$dir/文件$i”
完成
完成
此循环是一个单一的shell命令,不会产生额外的进程;:
命令的输出重定向由当前shell中的单个系统调用处理。代码的最大问题是xargs-n1-I%bash-c'touch
。对于要创建的每个文件,您都在执行两个进程-第一个bash
,然后触摸
。生成过程需要时间,一个文件需要两个
下面的可能更快,但我怀疑另一个答案中的纯bash解决方案可能更快。find
在/xfs/
中输出目录列表。然后seq
输出文件名后缀为数字的目录。然后,结果字符串被传递到touch
find /xfs/ -mindepth 1 -maxdepth 1 -type d |
xargs -d'\n' -I{} seq -f "{}/file%.0f" 1000000 |
xargs -d'\n' touch
如果您有GNU
xargs
,您可以通过将-p
添加到最后一个xargs
来轻松并行执行。这很快,因为它是一个进程,可以立即决定输出是什么,只需创建空文件
for dir in ./*/; do
split -d -n1000000 /dev/null "$dir/file"
done
我注意到类似的修改时间:
find . -type d | xargs -I{} split -d -n1000000 /dev/null {}/file
出于好奇,您为什么需要这样做?Bash在这里没有任何意义,您可以只使用
xargs-I%touch$dir/file%
获得相同的结果,尽管调用每个文件的touch
的单独副本(正如上面的xargs
建议所做的那样)当你关心性能时,这通常是一个坏主意;至少在你的写缓冲区满之前,xargs-I%bash-c'…%…'
开始新的/bin/touch
比实际创建文件花费更多的时间。顺便说一句,从安全角度来看,xargs-I%bash-c'…%…'
通常是一种严重的代码味道我们的值总是数字的——但是如果您在迭代文件名或其他自由格式的内容,您需要担心类似于$(rm-rf~)'$(rm-rf~)'
的内容被替换为%
,然后是一个副本或另一个副本(取决于%
所处的引用上下文类型)在5000个目录中以code.5000000000空文件的形式运行实际上是每个目录1000000个文件。我对文件系统处理此问题的能力表示怀疑,否则它将带来巨大的性能成本。在以后使用这些文件或只是处理这些文件将是一个问题。同时请记住,EXT4有一个问题d每个分区最多有2个文件4294967296,这少于您要创建的5000000000个文件。您还可以只运行“$dir/file$i”
没有:
,但是作为一个内置的,我看不出它会有这样的伤害。我假设创建文件的IO成本比隐式shell命令可能带来的任何轻微内部加速都要小。虽然说实话,出于POSIX的原因,我保留了:
,但这与我使用的C风格for循环无关:)。谢谢,这工作得更好。我是新来的,我知道我做得不正确。这工作得更快。如果你并行化内部for loopsTIL,它可能会更快。BSDseq
实现了-f
扩展;我假设它是GNUism。(不是那个“扩展”)对于一个根本不是标准定义的命令来说,这是一个有意义的概念)。就我个人而言,我可能会并行化,只对内部循环使用切普纳的答案,而对外部循环使用您的find
。find/xfs/-mindepth 1-maxdepth 1-typed-exec xargs-0-p20bash-c'”$@;do for((I=1;I>“$dir/file$I”;done;done'{}+
——将20调整为本地I/O子系统将承受的任何负载。