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

У меня есть этот скрипт 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 есть большие накладные расходы при работе с массивами.

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

  • Проверьте связанные имена файлов и удалите один из них
  • Как я могу правильно обосновать выход переменной длины?
  • echo string >> файл не работает
  • Как эхо анализирует $ 100?
  • Почему только 4 символа отправляются в последовательный порт через командную строку
  • Вернуться к спине Трубы в команду
  • Получить конкретный результат из функции
  • Как бы я запустил эту команду?
  • Изменить цвет ссылок http: // в bash
  • Bash - синтаксис в эхом
  • Почему не выводится текст, отправленный в эхо?
  • Interesting Posts

    Настройка IPSEC в локальной сети между двумя хостами (OpenBSD)

    Добавить и скомпилировать apt-get менеджер пакетов для LFS

    Последовательная связь не работает в обоих направлениях

    pv, работающий с существующим PID, не работает с опцией -s

    Как я могу извлечь / изменить строки в текстовом файле, данные которого разделены на поля?

    Почему я не могу выполнить установку iso в загрузочный раздел на USB-накопителе?

    Какова релевантность «en_AU» в «LC_CTYPE»? и что такое `locale LC_CTYPE` вывод?

    Запуск Mysql / Mariadb в Fedora не удалось

    Как найти старые каталоги в локальном каталоге, используя find в AIX?

    zsh продолжает забывать PATH vars

    Каков наиболее эффективный способ перемещения большого количества файлов, которые находятся в одном каталоге?

    Как мы можем переименовать файл с точкой с запятой в качестве части имени файла?

    количество файлов (на основе расширения файла) в нескольких папках

    Фильтровать столбцы на основе значения другого столбца

    отображение клавиатуры неверно только в определенных приложениях под TightVNC

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