我一直在测试使用最大 inode 的查找目录,并且在测试时我已经运行
touch test_{1..1391803}.txt
Run Code Online (Sandbox Code Playgroud)
但它给了我错误"-bash: /usr/bin/touch: Argument list too long"
,现在我在命令下运行,但似乎需要 Hugh 时间
ruby -e '1.upto(1391803) { |n| %x( touch "test_#{n}.txt" ) }'
Run Code Online (Sandbox Code Playgroud)
所以问题是:有没有办法在短时间内创建多个文件?我应该每个循环触摸 1 个 lac 文件还是更好的方法?
测试结果 :
1号
[root@dc1 inode_test]# time seq 343409 | xargs touch
real 0m7.760s
user 0m0.525s
sys 0m4.385s
Run Code Online (Sandbox Code Playgroud)
2号
[root@test-server inode_test]# time echo 'for (i=1;i<=343409;i++) i' | bc | xargs touch
real 0m8.781s
user 0m0.722s
sys 0m4.997s
Run Code Online (Sandbox Code Playgroud)
3号
[root@test-server inode_test]# time printf '%s ' {1..343409} | xargs touch
real 0m8.913s
user 0m1.144s
sys 0m4.541s
Run Code Online (Sandbox Code Playgroud)
4号
[root@test-server inode_test]# time awk 'BEGIN {for (i=1; i<=343409; i++) {printf "" >> i; close(i)}}'
real 0m12.185s
user 0m2.005s
sys 0m6.057s
Run Code Online (Sandbox Code Playgroud)
5号
[root@test-server inode_test]# time ruby -e '1.upto(343409) { |n| File.open("#{n}", "w") {} }'
real 0m12.650s
user 0m3.017s
sys 0m4.878s
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 12
限制是执行命令时参数的大小。因此,选项是执行带有较少参数的命令,例如xargs
运行较小的批处理,增加限制(ulimit -s 100000
在 Linux 上),不执行任何操作(在 shell 中执行所有操作),或在创建列表的工具中构建列表文件。
zsh
, ksh93
, bash
:
printf '%s ' {1..1391803} | xargs touch
Run Code Online (Sandbox Code Playgroud)
printf
是内置的,所以没有exec
,所以没有达到限制。xargs
拆分传递给的参数列表touch
以避免突破限制。这仍然不是很有效,因为 shell 必须首先创建整个列表(特别是用 慢bash
),将它存储在内存中,然后打印它。
seq 1391803 | xargs touch
Run Code Online (Sandbox Code Playgroud)
(假设你有一个seq
命令)会更有效率。
for ((i=1; i<=1391803; i++)); do : >> "$i"; done
Run Code Online (Sandbox Code Playgroud)
一切都在shell中完成,内存中没有存储大列表。应该是相对有效的,除了bash
.
POSIXly:
i=1; while [ "$i" -le 1391803 ]; do : >> "$i"; i=$(($i + 1)); done
echo 'for (i=1;i<=1391803;i++) i' | bc | xargs touch
awk 'BEGIN {for (i=1; i<=1391803; i++) {printf "" >> i; close(i)}}'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31145 次 |
最近记录: |