在bash中,我需要运行一个从i = 1循环到i = 99999999的脚本,但它总是耗尽内存。有没有解决方法?或者是否有最大值?
first=1
last=99999999
randomString="CXCXQOOPSOIS"
for val in $( seq $first $last )
do
padVal=$( printf "%010d\n" $val )
hash=$( echo -n $randomString$padVal | md5sum )
if [[ "$hash" =~ ^000000) ]]; then
echo "Number: $val" >> log_000000
echo "$val added to log - please check."
fi
done
答案 0 :(得分:5)
bash
提供类似C语法的for
循环:
first=1
last=99999999
randomString="CXCXQOOPSOIS"
for ((val=$first; val<$last; val++))
do
padVal=$( printf "%010d\n" $val )
hash=$( echo -n $randomString$padVal | md5sum )
if [[ "$hash" =~ ^000000) ]]; then
echo "Number: $val" >> log_000000
echo "$val added to log - please check."
fi
done
答案 1 :(得分:1)
你的seq
命令产生1亿个数字(一对数)并且需要800 MiB左右的内存才能只保存数字列表(可能是低估;每个数字可能保存在一个单独的内存中分配,这可能意味着指针为8个字节,分配的块为16个字节,这使存储空间估计增加了三倍。
您可以使用以下方式大幅改善:
for millions in $(seq 0 99)
do
for smallstuff in $(seq -f "%6.0f" 0 999999)
do
val="$millions$smallstuff"
...
done
done
这大大减少了所需的内存量;唯一需要注意的问题是它测试的是原始代码没有的0。
答案 2 :(得分:1)
如果您仍想使用seq
=&gt;因此,使用seq
:pipe
分开|
和循环
此解决方案更具便携性,可用于其他外壳。
内存打印仍然减少,但此脚本需要处理两个线程。
first=1
last=99999999
randomString="CXCXQOOPSOIS"
seq $first $last |
while read val
do
padVal=$( printf "%010d\n" $val )
hash=$( echo -n $randomString$padVal | md5sum )
if [[ "$hash" =~ ^000000) ]]; then
echo "Number: $val" >> log_000000
echo "$val added to log - please check."
fi
done