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

У меня есть этот скрипт 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?

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

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

Вы можете попробовать другой язык, например 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 есть большие накладные расходы при работе с массивами.

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