Bash脚本循环内存不足?

时间:2012-01-09 15:01:06

标签: bash loops for-loop seq

在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

3 个答案:

答案 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;因此,使用seqpipe
分开|和循环 此解决方案更具便携性,可用于其他外壳。
内存打印仍然减少,但此脚本需要处理两个线程。

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