Комбинированный генератор с памятью и управлением ресурсами

У меня есть этот скрипт bash, который генерирует каждую комбинацию массивов в 5-значном формате:

#!/usr/bin/env bash for combo in \ {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}\ {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}\ {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}\ {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}\ {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}; do echo $combo; done > output.txt 

Это приведет к выводу:

 $ ./script.sh aaaaa aaaab aaaac ... 

Однако это просто заморозит мой компьютер. Есть ли способ записать данные в файл все чаще? Кроме того, можно ли разделить вывод на разные файлы, например, на каждых 65536 строках? как output1.txt, output2.txt, output3.txt?

Спасибо за помощь!

5 Solutions collect form web for “Комбинированный генератор с памятью и управлением ресурсами”

Трудно сгенерировать эту большую перестановку, не удерживая огромную память в оболочке.

Вы можете попробовать другой язык, например Python:

 $ python -c ' import itertools, string l = [c for c in string.ascii_lowercase + string.digits] for p in itertools.product(l, l, l, l, l): print "".join(p) ' > file 

Вы можете использовать вложенные циклы, хотя они будут медленными:

 for p in {a..z} {0..9} do for q in {a..z} {0..9} do for r in {a..z} {0..9} do for s in {a..z} {0..9} do for t in {a..z} {0..9} do echo $p$q$r$s$t done done done done done | split -l 65536 --numeric-suffixes=1 --additional-suffix=.txt - output 

Я нашел хороший инструмент, называемый crunch который написан на C. У вас также есть опции для разделения выходных файлов по размеру или строкам файла!

Установить: $ sudo apt-get install crunch

 #!/usr/bin/env bash crunch 5 5 abcdefghijklmnopqrstuvwxyz0123456789 -o output/START -c 1048576 # Excel line limit 

Эта команда в выходной папке генерирует aaaaa-awrdd.txt, awrde-bi8gh.txt, bi8gi-b5pjl.txt, etc. Точно с 1.048.576 строк, что является лимитом Excel 2007+. Это также очень быстрое решение. генерируя 60.000.000+ комбинаций в 58 файлах, сделанных всего за 10 секунд! Отлично!

Для перестановок я использую следующий скрипт perl для генерации перестановок:

 #!/usr/bin/perl use strict; use Algorithm::Permute; my $q=shift or die("usage permgen n word-set\n"); my $p = new Algorithm::Permute([@ARGV],$q); while (my @res = $p->next) { print @res,"\n"; } 

Это можно использовать для создания перестановок очень разных наборов. Пример unicode dices:

 permgen 2 ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ | shuf -n 2 ⚅⚄ ⚅⚁ 

Для генерации вашего (ОГРОМНОГО) примера нам нужно написать: permgen 5 {a..z} {0..9}

В моей старой машине требуется 2 с для создания 1_000_000 перестановок

time permgen 5 {a..z} {1..9}| head -1000000| wc

bash всегда будет выделять все элементы в ОЗУ, прежде чем перебирать их с помощью цикла for . Вы действительно просите bash выделить много ОЗУ сразу, а ваш компьютер просто не так много, поэтому он вылетает / зависает.

Сами комбинации сами по себе этого не требуют (мои вычисления в оболочке дают около 500 МБ), но я полагаю, что у bash есть большие накладные расходы при работе с массивами.

Интересно, сколько свободной памяти у вас действительно есть.

  • Почему оболочки выполняют собственные команды «эхо» внутри?
  • Как получить обратный фон с помощью эха
  • эхо цветной текст с вкладками
  • Изменить цвет ссылок http: // в bash
  • Есть ли разница между двойным цитированием переменной или целой строкой в ​​эхо
  • Как я могу обрезать возврат каретки из текста, который передается в bash?
  • Почему тире расширяется \\\\ по-разному до bash?
  • Получить конкретный результат из функции
  • Как остановить «grep» от вырезания трубы
  • Механизм символа BELL '\ a'?
  • Escape-символы из эха -э
  • Interesting Posts

    задайте переменную внутри heredoc и используйте их снаружи

    Нежелательный ctrl + h в файле, сохраненном с выхода пользователя

    Установка PECL memcached получает ошибку

    Как заменить текст между двумя маркерами в файле секцией текста из другого файла?

    CentOS 6 связывает связь, круговое развертывание вместо активной резервной копии, дублирует кадры

    Как создать пользователя SSH, который может обращаться только к MySQL?

    Может ли lftp читать netrc для sftp-соединений

    Заполнение поддельных каталогов avfs в zsh

    Извлечение нескольких экземпляров текста между двумя словами, включая стартовое слово, но исключающее слово

    Проблемы с драйвером адаптера Wi-Fi Debian

    Как оправиться от chmod -R 000 / bin?

    команда elif бросает ошибку

    SSH: проинструктировать задний туннель для выхода по сломанной трубе?

    Обновление sudo apt-get не работает на Linux Mint 17.1

    Как определить, сколько памяти выделяется на ядро ​​для MPI-приложения GENE?

    Linux и Unix - лучшая ОС в мире.