메모리 및 리소스 관리 기능을 갖춘 조합 생성기

메모리 및 리소스 관리 기능을 갖춘 조합 생성기

모든 조합에 대해 5자리 길이의 배열을 생성하는 bash 스크립트가 있습니다.

#!/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줄씩 다른 파일로 분리할 수 있습니까? 출력 1.txt, 출력 2.txt, 출력 3.txt처럼요?

당신의 도움을 주셔서 감사합니다!

답변1

셸에서 엄청난 양의 메모리를 차지하지 않고 이러한 큰 순열을 생성하는 것은 어렵습니다.

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

답변2

느리기는 하지만 중첩 루프를 사용할 수 있습니다.

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

답변3

crunchIt's writing in 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+ 행 제한입니다. 이것은 또한 매우 빠른 솔루션입니다. 단 10초 만에 58개 파일에서 60,000,000개 이상의 조합을 생성하세요! 완벽한!

답변4

bashRAM의 모든 요소는 루프 반복을 사용하기 전에 항상 할당됩니다 for. 본질적으로 bash한 번에 많은 양의 메모리를 할당해야 하는데 컴퓨터에 그렇게 많은 메모리가 없기 때문에 충돌/멈춤이 발생합니다.

bash조합 자체는 그렇게 많이 필요하지 않지만(대략 계산해 보면 500MB 정도), 배열을 다룰 때 엄청난 오버헤드가 발생할 것 같아요 .

사용 가능한 메모리가 얼마나 되는지 정확히 알고 싶습니다.

관련 정보