Скрипт Bash выходит из памяти? - PullRequest
0 голосов
/ 09 января 2012

В bash мне нужно запустить скрипт с циклом от i = 1 до i = 99999999, но всегда не хватает памяти. Есть ли обходной путь? или есть максимальное значение для i?

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 ]

5 голосов
/ 09 января 2012

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 голос
/ 09 января 2012

Если вы все еще хотите использовать seq =>, поэтому разделите 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
1 голос
/ 09 января 2012

Ваша команда seq генерирует 100 миллионов чисел (не считая пары) и требует около 800 МБ памяти для хранения только списка цифр (вероятно, заниженной оценки; каждое число может храниться в отдельном выделении памяти, что может означать 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, чего не было в вашем исходном коде.

...