devpia logo

개발자고충상담

프로그래밍 고수님들께 여쭙니다.. 이거 어려운 겁니까??

레드햇 / 2019-12-01 오전 1:45:05 / 조회수(1309)

프로그램밍 좀 하신다 하는 분들도 갸우뚱 하셔서 질문좀 드리겠습니다..

 

긴 글이지만 읽어보시고 이게 어려운 건지 아닌지.. 판단해 주셨으면 합니다..

 

혹여 작업 가능한 분은 메일로 연락 주시면 감사하겠습니다.. 사례합니다..

 

redhat4u@gmail.com

----------------------------------------------------------------

 



 

 

불러오는 자료는 파일에 저장된 값이며, 그 값은 다음과 같은 형식으로 되어 있습니다.

 

[사용자이름_숫자및 특수문자(~.*! 등등)포함하여 20자] [구분자_공백 또는 탭] [콤마로 구분된 번호 나열]

[콤마로 구분된 번호 나열] 자료는 15개와 10개 두가지를 사용합니다..

 

여기서 자료란 이름 뒤에 '숫자,숫자..' 숫자 갯수가 15개라는 뜻입니다..

원소는 이름과 콤마로 구분되어진 숫자나열을 포함한 1행(1줄)을 뜻합니다..

 

예를 들어  다음과 같습니다..

 

김명자   01,03,08,09,16,17,22,24,25,26,33,36,41,43,44<= 원소 1개 (김명자라는 이름과 그 뒤에 번호 나열이 1개의 원소.. 즉, 1줄이 원소임)

최순옹   01,04,05,11,12,14,17,18,20,26,29,30,35,36,41

배길수   01,04,05,10,12,13,14,15,18,24,26,31,33,34,41

나영인   01,03,05,08,09,16,18,20,25,31,33,34,36,39,40

이영하   01,05,06,07,13,15,22,25,26,27,32,33,34,36,44

오영주   08,10,11,14,16,20,21,22,30,31,33,38,39,40,44

박형식   03,04,06,12,14,16,17,22,25,26,29,33,36,40,43

노태식   04,06,09,12,14,15,17,18,20,22,24,29,33,35,38

.

.

.

 

----------------------------------------------

 

김명자   07,16,23,24,26,28,33,34,37,42

최순옹   05,08,18,21,23,26,36,40,41,44

배길수   07,16,18,23,27,29,31,37,38,40

나영인   06,11,12,19,25,26,32,33,38,41

이영하   05,12,17,24,29,33,37,40,42,43

오영주   03,16,19,21,36,40,42,43,44,45

박형식   03,05,11,16,19,20,21,25,36,41

노태식   02,11,12,19,20,21,25,26,33,42

.

.

.

 

----------------------------------------------

 

자료가 다음처럼 15개 와 10개가 혼합되는 경우는 사용하지 않습니다..

 

김명자   01,03,08,09,16,17,22,24,25,26,33,36,41,43,44

최순옹   05,08,18,21,23,26,36,40,41,44

배길수   01,04,05,10,12,13,14,15,18,24,26,31,33,34,41

나영인   06,11,12,19,25,26,32,33,38,41

.

.

.

 

----------------------------------------------

 

자료 처리는 각조합을 콤마로 구분된 숫자들을 중복된 번호 한개만 놔두고 제거한 후, 콤마로 이루어진 번호로 다시 정렬(오름차순-작은 번호에서 큰번호 순으로)하는 것입니다.  위의 예처럼 번호가 오른쪽으로 갈수록 커지는 정렬..

 

위의 조합이란, 특정 갯수의 원소에서 특정 갯수로 묶어서 중복되지 않게 생성된 조합 1개를 말합니다..

예를 들면 다음과 같습니다..

 

[A,B,C] 이 세개의 원소를 2개씩 중복되지 않는 조합을 만들면 [A,B], [A,C], [B,C] 이렇게 3조합이 나옵니다.. 이 중 1개를 말합니다..

 

자료 처리 중 특정 갯수의 숫자 이상이 나오는 조합만 따로 DB에 저장하고, 처리후 숫자가 36개 미만이나 39개 초과되는 결과물 조합은 DB에 따로 저장하지 않고 바로 버립니다..  즉, 35개 이하와 40개 이상되는 숫자 조합은 저장하지 않고 버리는 것입니다..

 

가능한 조합을 모두 뽑아서 DB에 저장해놓고 진행하는 방식은 insert 하는 시간이 많이 걸리는데다 저장된 조합을 DB에 다시 불러서 연산하는 시간이 너무 오래 걸리기 때문입니다.. 제 생각이지만 연산과정을 먼저한 후 해당되는 조합만 DB에 저장하는 것이 시간도 상대적으로 적게 걸리고 DB 용량도 줄이는 효과가 있을 것으로 보입니다..

 

위의 내용을 예로 들어 보겠습니다..

 

김명자   07,16,23,24,26,28,33,34,37,42

최순옹   05,08,18,21,23,26,36,40,41,44

.

.

.

 

일단 위의 두개의 원소를 중복된 번호 한개만 남기고 다시 콤마로 정렬한 결과는 다음과 같습니다.. 총 갯수가 36개로 가정하겠습니다..

 

05,07,08,16,18,21,23,24,26,28,33,34,36,37,40,41,42,44,...(각 번호 숫자 갯수가 36개로 가정)

 

이 번호의 갯수가 36개 미만일 경우는 결과값을 버리고, 다음 조합을 진행하고 36개 이상일 경우는 다음과 같이 한줄인 row(또는 record) 처리하여 DB에 저장하는 방식입니다..  저장된 형식은 다음과 같습니다..

 

1회차   자료10   결과36   김명자,최순옹,...   05,07,08,16,18,21,23,24,26,28,33,34,36,37,40,41,42,44,...

 

DB의 key값은 3개 입니다.. 우선 몇회차 인지를 기록하는 Key,  자료가 15개짜리인지 10개짜리인지를 기록하는 Key, 중복된 번호 한개만 남기고 정렬한 숫자가 몇개가 남았는지 나타내는 결과값 Key 입니다..

 

첫번째 Key 값의 회차란, 저 한줄인 row가 1회차가 아니라 파일을 불러와서 그 안에 있는 원소로 위와같이 조합을 만들어 연산하는 총 과정이 1회차에 해당합니다..  회차는 9999회 까지의 입력만 받습니다.. 5자리 이상의 회차는 오류 메시지를 띄웁니다.. 

 

회차값은 자동으로 카운팅이 되는 것이 아니라 사용자가 직접 입력해야 하는 것이며, 회차 입력값 없이 '파일 불러오기' 버튼을 클릭하여 파일을 불러온 후 [시작] 버튼을 클릭할 경우에는 작업이 진행되지 않고 입력해야만 진행할 수 있다는 안내창이 뜨게 하는 것입니다..  

 

입력한 회차가 이미 DB에 있다면 덮어씌우고 새로 저장할 것인지 아니면, 이미 저장된 회차의 DB를 불러와서 화면에 보여줄 것인지을 선택하는 창이 떠야 하겠네요.. 또한, 회차 입력란 밑에 입력한 회차의 DB를 삭제하는 기능도 있었으면 합니다.. 

 

[저장된 DB 삭제] 버튼을 클릭하면 현재 저장되어 있는 DB 회차 목록을 보여주면서 삭제할 DB를 복수개로 선택할 수 있도록 했으면 합니다..

 

 

두번째 자료가 15개짜리인지 10개짜리인지를 기록하는 Key값은 밑에서 설명드리겠지만, 화면 구성을 탭으로 할 경우 각 화면에 맞게 알아서 구분되어 입력되도록 하는 것입니다..  제 생각이지만 숫자 부분의 콤마 갯수만 세어도 10개의 자료인지 15개의 자료인지 구분할 수 있을 것 같습니다..

 

위의 예와같이 특정 갯수의 숫자가 결과물로 나오면 그 조합에서 사용한 이름도 콤마로 구분해서 DB에 저장되는 형식입니다..  어떤 조합에서 결과값이 나왔는지 알 필요가 있기 때문입니다..  이 연산 과정이 빨리 진행되어야 하는것이 이 프로그램의 제일 중요한 핵심입니다..

 

제가 수동으로 자료처리했던 과정은 에디터에서 파일을 불러들여 이름 뒤에 숫자만 따로 추출(ALT 키를 누른채로 마우스로 특정 부분을 드래그)하여 ',' 콤마를 정규표현식의 '\n' 줄바꿈으로 바꾸면 번호가 쭉 일렬로 됩니다.. 그것을 다시 중복된 숫자 제거한 후 오름차순 정렬한 최종행의 총 갯수를 알아냅니다..  파일의 마지막 행(정규표현식을 통해 '^' 첫문자가 줄바꿈 또는 숫자가 아닌행은 제외)의 값으로 원소가 총 몇개인지 알아내는 것이죠..

 

----------------------------------------------

 

자료가 15개일 경우 최대 100억개 조합을 넘지않는 조건은 다음과 같습니다.

실제로 특정 갯수의 결과 조합만 DB에 저장할 경우 억단위 이하의 조합만 저장될 것으로 예상됩니다..

 

6개씩 묶는 조합은 최대 원소가 141개로 제한,

7개씩 묶는 조합은 최대 원소가 93개로 제한, (라디오 버튼 Default 값)

8개씩 묶는 조합은 최대 원소가 70개로 제한,

 

다음은 n! / r! x (n-r)! 공식을 통해서 얻은 원소가 서로 중복되지 않는 조합 갯수입니다.

 

자료가 15개일 경우   9,798,689,908141개   원소/6개씩 묶는 조합   약 97억 조합

자료가 15개일 경우   9,473,622,44493개   원소/7개씩 묶는 조합    약 94억 조합

자료가 15개일 경우   9,440,350,92070개   원소/8개씩 묶는 조합    약 94억 조합

 

----------------------------------------------

 

자료가 10개일 경우 최대 100억개 조합을 넘지않는 조건은 다음과 같습니다.

실제로 특정 갯수의 결과 조합만 DB에 저장할 경우 억단위 이하의 조합만 저장될 것으로 예상됩니다..

 

10개씩 묶는 조합은 최대 원소가 49개로 제한, (라디오 버튼 Default 값)

11개씩 묶는 조합은 최대 원소가 44개로 제한,

12개씩 묶는 조합은 최대 원소가 41개로 제한,

 

다음은 n! / r! x (n-r)! 공식을 통해서 얻은 원소가 서로 중복되지 않는 조합 갯수입니다.

 

자료가 10개일 경우   8,217,822,53649개   원소/10개씩 묶는 조합   약 82억개 조합

자료가 10개일 경우   7,669,339,13244개   원소/11개씩 묶는 조합   약 76억개 조합

자료가 10개일 경우   7,898,654,92041개   원소/12개씩 묶는 조합   약 78억개 조합

 

----------------------------------------------

 

자료가 15개인 화면과 10개인 화면을 인터넷 브라우저 처럼 탭으로 구성하고, 몇개씩 묶을 건인가는 아래처럼 설명과 함께 라디오 버튼식으로 구성되었으면 합니다.. 원하는 조합단위를 선택 후 [작업시작] 버튼을 클릭하면 파일을 검사해서 표시된 제한 원소(행)보다 많을 경우 오류 메시지를 보여주는 형식입니다.

 

자료가 15개인 경우 라디오 버튼은 아래와 같습니다.

조합단위: ( ) 6개 1조합(최대 141개 원소 제한)     (*) 7개 1조합(최대 93개 원소 제한)     ( ) 8개 1조합(최대 70개 원소제한)

 

자료가 10개인 경우 라디오 버튼은 아래와 같습니다.

조합단위: (*) 10개 1조합(최대 49개 원소 제한)     ( ) 11개 1조합(최대 44개 원소 제한)     ( ) 12개 1조합(최대 41개 원소 제한)

 

화면 하단에 %를 포함한 진행바를 통해 현재 진행상태를 표시했으면 합니다.. 시간이 오래걸릴 경우 진행여부를 알 수 없기 때문입니다.. 처리하는 도중에 위에 선택한 특정 개수 이상되는 조합이 나올 경우 다음처럼 화면하단부에(진행바 보다 위에) 일단 갯수만 표시되었으면 합니다..

 

(*) 36개 숫자 이상되는 조합: xxxxx개( ) 37개 숫자 이상되는 조합: xxxxx개( ) 38개 숫자 이상되는 조합: xxxxx개( ) 39개 숫자 이상되는 조합: xxxxx개

 

작업이 다 끝나거나 중단할 경우 까지의 내용을 위의 내용처럼 라디오버튼으로 선택 후 각각 파일로 저장할 수 있는 항목이 있으면 합니다.. 위의 예에서는 자료 15개와 10개는 각각의 탭으로 화면 구성이 될 것이므로 회차와 특정갯수의 결과물만 저장하는 내용으로 표시되었습니다..

 

파일이 커질 가능성이 높다고 예상되므로 36개 조합 따로.. 37개 조합 따로..  파일이 저장되어야 하지 않을까 싶네요.

파일이 커질경우 100Mb 단위로 잘라야 합니다.. 그래야 editplus 같은 편집기에서 불러올 수 있으니까요..

 

----------------------------------------------

 

일시정지 및 중단 버튼이 있어서 말그대로 일시정지후 다시 이어서 하거나, 정지할 경우 작업을 중단하지만

추후에 원하면 다시할 수 있게 중단할 당시 처리하던 조합을 기억(파일로저장)해서 다시 작업할 수 있었으면 합니다..

 

이렇게 하려면 특정 원소로 특정갯수로 묶는 전체 조합을 미리 계산한 후, 현재 진행중이던 조합이 몇번째였는지를

카운팅하는 것이 필요할 것 같군요..

 

이유는 시간이 오래걸리거나 잠시 다른 이유로 컴퓨터를 꺼야 할 상황일 때 작업하던 것을 처음부터 다시하기에는 시간이

너무 오래걸리기 때문입니다.. 이어서 작업하는 기능은 반드시 필요한 것 같습니다..

 

 

----------------------------------------------

 

각 버튼에 대한 이벤트는 간단히 설명드리면, [저장된 DB 삭제] 버튼을 클릭시 DB 저장목록을 보여줍니다.. 위에 잠시 설명드렸습니다..

 

[파일 불러오기] 버튼을 클릭하면, 불러올 파일 탐색창이 뜨는데 불러와서 [시작] 버튼을 클릭시 회차 입력란이 공란일 경우 진행이 되지 않습니다.

 

[일시정지], [중지], [시작] 각 버튼은 기본적으로 파일을 불러오고, 회차가 입력되어야 작동되는 것이구요..

 

[파일로 저장] 버튼도 DB에 저장된 내용이 있어야 파일로 저장할 탐색창이 뜨는 것이구요.. 저장되어 있다면 DB 목록을 보여주면서 파일로 출력할 회차의 DB를 선택(중복선택 안되도록)할 수 있도로 해야 할것 같습니다..

 

----------------------------------------------

 

이해가 되셨나요??  위에 내용이 너무 거창하게 설명되었지만, 내용은 간단합니다.. 

이해 못하시는 분들이 많아서 일일히 좀 길게 설명드린 것 뿐입니다..  

 

특정 갯수가 나온 조합만 추려서 DB에 저장하고 불러서 파일로 저장하는 것이 가장 주요 핵심 처리과정 입니다..

DB가 제일 문제일듯 싶습니다...  약 몇십억개 가까운 내용을 insert 하는데 시간이 걸릴것 같으니까요..  빨리 처리해야 하는 작업이라서요..

 

배너

댓글보기

칡흙 / 2019-12-01 09:59

참고해보세요. ㅇ_ㅇ;; 성능 좋습니다... 데이터 센터도 있고... 슈퍼컴퓨터. PC방... 호스팅업체. 그래픽카드. 등등... 초당 200GB 광통신도 된다고 하니... 다 넣고. 비교하는 방법 (각 번호순서 인덱스로 검색) 다 빼고. 비교하는 방법 분산해서 처리하는 방법 - 파일 쓰기 속도 (DB 포함) HDD 1초에 100MB SSD 1초에 500MB RAM 1초에 3GB - 배열 1000바이트. 중복 비교 성능. GFlops 단위. GPGPU VPU > DirectX OpenGL OpenCL OpenCV > AVX > registry > cache > I/O FSB > RAM > SSE MMX > 네트워크 드라이브 클라우드 컴퓨터 RAID VDI RPC SSD USB SmartPhone DockerContainer > HDD - SQLite WALDIO 30배 빠르다고 함 - 일본 30배 빠른 프로토콜

JUNE_MS / 2019-12-01 16:04

와우 엄청난 긴 글이네요 ㅋ

레드햇 / 2019-12-01 16:08

막상 내용은 간단합니다.. 설명하는라 글이 길어졌습니다..

야근제로 / 2019-12-01 16:51

막상 작업하면 결과가 이상하다고 엄청 뭐라할거같은 느낌..ㅋㅋ 갠적인 생각인데.. 어렵다기보다는 글쓴이가 자기가 만들고 싶은걸 명확하게 이해를 한건지도 의문이 듬.. 내용이 간단하면, 그 설명도 간단해야됨 지금 그게 안되고 있는거같고.. 그렇다면 만드는 사람은 오죽 더 이상하게 만들겠음.. 게다가 간단한 프로그램이라면서 사례비는 그냥 수고비정도로 줄거같은데.. 누구라도 하고싶은 일은 아닐듯함.. 그냥 그정도 GUI 프로그램 만드는거 어려운거 아니니까, 직접 C# 같은거 배워서 만드세요

레드햇 / 2019-12-01 17:36

명확하게 이해안하고 장문이 가능합니까?? ㅎㅎ 그리고 프로그램이라는것이 정확한 결과를 얻기위한 것인데 결과가 이상하다고 엄청뭐라할것같다... 그건 전 우주 어디가도 똑같지 않을까요?? 누가 엉뚱한 결과를 얻길 원할까요??? 여기있는 분들 엉뚱한 결과 얻기 위해 떠들고 있나요?? 야근제로님은 엉뚱한 프로그램을 만들려고 프로그래밍 하십니까?? UI만 깔끔하고 결과는 엉뚱하게 나오는게 프로그램인가요?? 야근제로님의 마인드가 더 엉뚱 발랄하군요... 의뢰할때 알아듣고 작업하는 분이 이해가 안가서 장문으로 한것이고.. 맨 밑에 요약처럼, DB로 들어가는 내용만 특정 갯수 숫자의 조합만 들어가는게 핵심이고 그 작업을 빨리해야한다는 것입니다.. 그리고 수고비라는게 얼마를 말하는 것이죠?? 제글에 수고비라는 말이 있던가요?? 원하시는 금액을 제시해주시면 됩니다.. 글을 설렁설렁 읽으신 것 같은데 넘겨짚고 말씀하시는것이 더 보기 안좋습니다.. 자신있게 말씀하셨는데 충분한 실력은 되시는지요??

allinux / 2019-12-02 02:10

로또 관련된 것 같아 보이네요. 과거 함께 일하시던 분(개발자)이 로또 번호를 맞추겠다며 비슷한 작업을 주말마다 하시던데...인생역전 하셨는가 모르겠네요. 질문이 몇가지 있네요. 일단 대충봐도 수십억건 처리를 해야 하는 듯 한데 그 빨리해야 한다는 부분에서 그 빨리가 어느정도인가요? 그리고 DB라고 하는 것이 정확히 무엇인가요? 오라클 같은 일반적인 RDBMS 를 말하는 것인가요? 음... 그리고 빨리 처리하기 위한 인프라는 되어 있는 건가요? 즉 개발만 하면 된다는 것인지... 제가 볼 때 가장 큰 걸림돌은 원하는 시간내에 수십억건 INSERT 하는 것입니다. 그것도 '일시정지' 라는 상황(벌크 INSERT 를 고려하기 힘듬)을 고려하면서 말이죠.

여라 / 2019-12-02 10:31

자세하게 읽지는 않았지만, 말씀하신대로 내용은 간단해보이네요... 계산식 자체는 경우의 수가 많아서 복잡할 뿐 어렵지는 않을 거 같은데, 다만, 위에 alinux님이 말씀하신대로 이런저런 이유로 속도와 예외 상황에 대한 처리가 걸리겠네요. 그리고 저런 자잘해 보이는 프로그램 서너번 해본 입장에서 (선입견일수 있지만....) 사용자 입장에서 별거 아닌거 처럼 보이니 돈은 많이 못받는데... 어쨋든 프로그램 만들어주면, 이런 기능도 넣어달라, 저런 기능은 왜 없느냐, 속도는 왜 이렇게 느리냐, 등등... 후속 조치 때문에 개발자 입장에서는 돈도 못 받고 스트레스만 받는 경우가 대부분입니다. 부디 기획하는 과정에서 명확하게 선을 긋고, 후려치지 않는 적절한 금액으로 만드시길 바랍니다.

SkyNET / 2019-12-02 11:09

파일의 데이터 처리는 정규식 쓰면 될거고.... 뭐 그닥 어렵지는 않겠는데...

레드햇 / 2019-12-02 11:58

allinux님 답변 감사합니다.. 그외에 답변 달아주신분들도 감사합니다.. 오히려 의뢰자 입장에서 명확하게 선을 그어서 하느라 저렇게 장문이 된겁니다.. 일일히 어느정도 로직은 물론 버튼 이벤트랑 UI까지 그려서 설명하고 의뢰하는 사람 보셨나요?? 단순 수고비로 해달라고 말씀드린적 없고, 이런거 저런거 추후에 없게끔 일일히 설명드린겁니다.. 단, 제일 중요한 것은 속도가 우선이다 라는 표현을 몇번씩 말씀드린거구요.. 일단 allinux 님의 코멘트에 답변을 드리면 만하루(24~28시간) 정도 사이에 빠른 속도로 결과물이 나온다면 저장 방법은 어떤 것이든 상관없습니다.. 제가 알아본 바로는 CPU 보다는 CUDA GPU 병렬처리 방법과 DB를 통해서 저장하는 방법이 안전하고 빠르다고 들었기 때문입니다.. 장비 인프라는 CUDA를 사용햇을 경우에 속도가 월등히 차이가 날 경우 Nvidia 그래픽과 RAM을 보강할 예정입니다. DB 또한 꼭 RDBMS 아니더라도 몇십억개의 조합을 처리할 수 있는 것이면 됩니다.. DB라고 하는것은 결과물을 저장하기위한 수단일뿐 대체가능한 것은 어떤 것이든 괜찮습니다.. 일시정지 기능은 제가 시간이 오래걸릴 것을 예상해서 넣은것일뿐 생각보다 일이 복잡하고 커지면 빼도 상관은 없습니다.. 다시 이어서 작업하는 것도 맨위에 분 말씀처럼 모든 조합을 뽑아서 DB에 저장해 놓은 상태라면 번호 index를 통해서 다시 불러오는 방법도 있겠네요.. 여기저기 알아봤는데 아직 답변이 없네요... 작업해주실 분은 메일로 연락바랍니다.. 예상 금액 포함해서요... 다들 간단하다고 말씀만 하시고 정작 진행하시는 분은 안계시네요.. 조합만 뽑아볼려고 아래와 같이 파이썬을 돌렸는데 memory error가 나오네요.. import itertools ids = ["강남영","강다영","강다현","강민경","강민영","강민정","강서연","강소라","강우경","강이은","강정화","강주은","강지영","강지우","강초희","강혜정","경인선","고가령","고다미","고다연","고도영","고두림","고미영","고민시","고보결","고서희","고수진","고용화","고은민","고은아","고은채","고정민","고주연","고주희","공라희","공상아","공서윤","곽선영","곽지민","곽진영","구민지","구자미","구혜령","구혜진","국지연","권기선","권남희","권다현","권성현","권소현","권연우","권은빈","권재희","권진영","기은세","길은혜","길해연","김가란","김가희","김경숙","김경아","김국희","김규리","김규리","김규리","김꽃비","김나운","김다래","김다미","김다예","김다인","김단비","김도연","김도연","김리나","김리원","김명지","김미경","김미라","김미려","김미림","김미성","김미숙","김미야","김미정","김미희","김민경","김민경","김민주","김민희","김보라","김보미","김보민"] result = list(itertools.combinations(ids,7)) out = open('list.txt','w',encoding='euc-kr') print(result,file=out) out.close()

allinux / 2019-12-02 13:35

뭐든 대용량이 되면 쉽지 않습니다. cuda는 연산이 빠른것이지 io가 빠른 것이 아닙니다. 문제 즉 bottleneck은 storage에 저장시 io 시간입니다. 그리고 관리측면은 전혀 고려를 안하는 것 같습니다. 운영 및 백업정책은 어떻해 하실 건지요? 물론 이제는 클라우드 시대라 클라우드 기반으로 간다면 데브옵스 형태로 갈 수 있고 인력을 상당히 줄일수는 있습니다. aws 에서 aurora(mysql) 로 db.r3.xlarge 인스턴스에 3000 IOPS SSD 의 ebs 로 셋팅하여 insert 관련한 poc 를 한번 해보시기 바랍니다. 검색해보니 11.9G 3천만건 넣는데(mysqldump) 1시간 50분 걸렸다는 이야기도 있군요. 상황이 다른 데이터니 직접 poc 해보면 인력소싱하기도 좋겠지요. 그리고 파이썬 코드는 수십개의 조합을 메모리에 저장을 하고 그것을 파일에 쓰니 메모리가 부족한겁니다. combinations 의 리턴이 제너레이터 입니다. 제너레이터를 list 로 받아내면 메모리가 full 납니다. 제너레이터에서 반복처리하여 저장하면 시간은 걸려도 메모리 오류는 안날겁니다.

레드햇 / 2019-12-02 14:06

allinux님 답변 감사드립니다.. 일단, DB의 경우 운영이나 백업은 필요치 않습니다.. 로컬에서 돌릴 예정이고요.. 경우의 수 모든 조합이 필요한 것이 아니라 특정 갯수가 남은 숫자 조합만 필요한 것이라서요.. 그렇지 않아도 mysql이나 mariadb로 분할기술을 통해 해보라는 의견도 있었습니다.. 말씀하신 aws 는 Amazon Aurora MySQL 을 말씀하시는 것 같군요.. 그래서 연산만 빨리해서 부합되는 조합만 DB에 넣는 것이기 때문에 io 속도까지는 크게 고려하지 않아도 된다고 하더라구요.. 물론 SSD 사용은 기본이구요.. 단, 이어서 하는 기능은 포기해야 할 수 있다고 하구요.. 혹시 위와 같이하는 것은 큰 어려움없이 가능한 것이겠죠?? 파이썬은 요즘 관심이 있어서 그냥 끄적여 봤습니다.. ^^ 제너레이터를 list 말고 무엇으로 받아야 하는지요?? 반복일경우 끊어야 할 부분이 있다는 것인데.. 그래서 끊어지는 부분을 다시 돌린다는 얘기인데.. 어디서 끊어야 할까요??

allinux / 2019-12-02 14:10

잠시 고민을 해봤는데... 단순하게 저장, 조회만 고민한다면 결과를 날짜등의 파티션별로 csv 로 저장하고 그 파일을 aws s3 에 업로드를 합니다. 그리고 조회는 athena 혹은 redshift 를 이용하여 조회하겠네요. 다만 row 단위의 수정 및 삭제는 되지 않습니다. 즉 삭제는 파일 단위 삭제가 될 겁니다. 빅데이터인 상황에서 수시로 수십억건 처리를 rdbms 사용할때처럼 하기는 힘들 듯 싶고 아키텍쳐를 재고해보셔야 할 것 같습니다.

allinux / 2019-12-02 14:21

느린 이유가 io 즉 읽고 쓰기가 수십억번 진행해야 하기 때문입니다. cpu 연산량이 문제가 아닙니다. cpu 와 ssd는 엄청난 성능 차이가 있는 부품입니다. ssd 작업할때 cpu 는 idle 입니다. rdbms에 수십억건 io 처리를 로컬에서 24시간내에 될 것 같지가 않네요. python 제러네이터는 한번 검색해보세요. yield 구문을 만나면 바로 반환이 되고 next시에 또 이어서 반복을 합니다. return 과 다른 개념입니다.

레드햇 / 2019-12-02 14:24

allinux님 쪽지 보내봅니다..

기산저수지 / 2019-12-02 14:29

굳이 db로 해야 되나요? 파일로 하면 제일 빠를꺼 같은데? 중요 파일이라면 파일 백업 사용자가 직접하고.. 내용물 계산은 메모리에서... 조합하는 방식은 자세히 않읽어 봤지만 규칙만 명확하면 될것 같고... 내용만 명확하면 고수가 아니라,,초보라도 가능한일

레드햇 / 2019-12-02 14:39

저수지 님이 쉽다고 하시니 작업의뢰해도 될까요?? 초보라도 가능하다고 하셨으니 님께서 작업을 못하시면 초보만도 못하다는 것이 되네요.. 댓글보시면 아시겠지만, 특정 숫자 갯수가 나온 조합만 뽑아내면 되는 겁니다.. 몇십억개의 조합을 모두 계산후에... 가능 하시겠습니까??? DB, 파일 아니라 그 무엇이라도 괜찮습니다.. 이진 파일이 아닌 에디터에 불러올수 있는 텍스트 형식이라면요.. 여지껏 의뢰한곳이 몇십군데인데 답변 온곳 딱 1곳이었습니다.. 제 글 잘 읽어보시고 답변 기다리겠습니다...

맨즈밤 / 2019-12-02 15:42

지나가다가 궁금한게 있어서요.. 개발을 할려거나 하는건 아닙니다..단지 호기심에서 질문드립니다. 하나의 케이스만 예를들면 입력받은 자료를 중복제거하고 나열한후 , 숫자의 갯수가 36개가 나오면 그걸 6개조합의 숫자들을 뽑고 싶으신다는거 맞나요? 본문의 예에서 A,B,C 에서 2개조합으로 할경우 3개가 나왔는데 , 그 AB , AC, BC 이 3개의 자료가 필요하다는건가요? 더 예를들어서 A,B,C,D,E 중에 3개조합으로 할경우 10개의 자료가 나오는게 맞는건가요? 자꾸 질문드리는 이유는 36개숫자중 6개조합이 1947792개 나오는거같은데 본문엔 수십업의 숫자가 있어서요...

레드햇 / 2019-12-02 15:48

A,B,C,D,E 중에 3개조합으로 할경우 10개의 자료가 나오는게 맞습니다.. 36개숫자중 6개조합이 1947792개 나오는거 맞습니다.. 그런데 제가 36개중 6개 나오는 조합을 말한적이 없습니다.. 결과가 36~39개의 숫자가 나오는 것이지, 처음부터 36개의 원소를 가지고 6개씩 묶는 조합을 얘기한 것이 아닙니다.. 글을 잘 읽어 보시기 바랍니다..

맨즈밤 / 2019-12-02 15:59

후후후 ..글 잘못 읽어서 죄송합니다.. 제가 큰 잘못을 저질렀네요. 쿼리를 통한 좋은 방법이 있는거같아 말씀드렸더니만...

레드햇 / 2019-12-02 16:11

잘못까지는요.. ㅎㅎㅎ 관심가져주셔서 감사합니다... ^^

분당에집갖고싶어 / 2019-12-04 17:46

어려워보이네요..ㅠㅠ

레드햇 / 2019-12-04 18:45

여기저기 알아보니 분당님 처럼 말씀하시고 생각하시는것이 맞다는 결론입니다. 그래도 솔직하시네요.. 댓글 다신분들 초보도 할 수 있다는둥 말씀은 하시지만 해보겠다는 분은 아직 한분도 없습니다.. 프로그램 전문업체조차.. 전문 종사자분들이 말하기를 쉽다고 말하는 사람은 아무것도 모르면서 그냥 하는 소리랍니다.. ㅎㅎㅎ

allinux / 2019-12-05 01:13

해보겠다는 분이 없는 것은 제 생각에 비용적인 부분도 있고 의뢰하시는 레드햇님 조차 될지 안될지 명확하지 않기 때문입니다. 의뢰자의 요청 바운더리가 명확하지 않기 때문에 개발자 입장에서 선듯 나서기가 힘든겁니다. 사람은 누구나 손해보고 싶어하지 않습니다. 지금의 요청은 될지 안될지 우선 poc(proof of concept) 를 해달라는 건지...아니면 될지 안될지 나도 모르니 할사람을 구하는 건지...방향을 알수가 없습니다. 만약 후자라면 당연히 할사람 찾기가 힘들겁니다. 그리고 작업을 로컬에서 하시겠다고 하시는데 전용 서버를 둬야 합니다. 서버 구축 비용이 크므로 클라우드를 이용하는 편이 낫겠지요. 또 저장을 어딘가에 했다고 해도 검색도 해야지요? rdbms 에 저장된 수십억건 데이터에서 추출하는건 성능이 안나옵니다. 결국 빅데이터 솔루션을 이용해야 합니다. UI 를 봐도 adhoc 검색이 되어야 하는 것 같은데...버튼 클릭하자마자 결과가 나올수가 없습니다... 현재 제가 하는 작업이 수만대의 장비에서 하루에 쏟아지는 로그들(하루 수십기가 분량)을 spark 를 이용해서 전처리를 하고 파일로 재적재를 한 뒤 그 파일을 elasticserch 에 indexing 하여 로그를 조회할 수 있는 서비스를 개발하고 있습니다. 단순히 로그전처리하여 검색하는 서비스인데 5명 정도가 붙어있습니다. 데이터가 커지면 쉽지 않습니다. 생각난김에 제러네이터 관련한 부분은 아래와 같이 코딩하면 될 겁니다. 두 종류로 각각 구현해봤는데 io작업을 줄이면 확실히 성능이 좋아집니다. 제피시가 i5-6600 에 ssd(쓰기가 대략 500메가 나옵니다.) 입니다. 첫번째는 100000 만큼씩 메모리에 작업하고 파일에 씁니다. 56초 소요 두번째는 매번 파일에 쓰는 형태구요. 80초 소요 # 코드는 https://github.com/allinux/combination_example 에 있습니다. 들여쓰기 때문에 github에 올립니다. import itertools as it import timeit def main(): ids = range(1, 46) with open('d:\\list.txt','w',encoding='euc-kr') as f: temp = [] for i, v in enumerate(it.combinations(ids, 7), 1): if i % 100000 == 0: f.write("\n".join(temp)) temp.clear() if i % 1000000 == 0: print(i) else: temp.append('{}'.format(v)) print(timeit.timeit(main, number=1)) # 56초 ================================================================================== import itertools as it import timeit def main(): ids = range(1, 46) with open('d:\\list2.txt','w',encoding='euc-kr') as f: for i, v in enumerate(it.combinations(ids, 7), 1): if i % 1000000 == 0: print(i) else: f.write('{}\n'.format(v)) print(timeit.timeit(main, number=1)) # 80 초

여라 / 2019-12-05 10:54

아직까지 문의하는 사람이 없다고 하셨는데, 일단, 이 일을 처리할 만한 개발자가 많지는 않습니다. 제가 쉽다고 했던 부분은 계산을 위한 알고리즘 부분이구요. 10년차가 넘어가지만, 억단위 이상의 데이터를 처리해본 적이 거의 없습니다. 제 주변에도 그 정도 데이터를 다뤄본 사람이 몇명이 안됩니다. 그리고 개인적인 의견은, 이 일은 문의를 드릴만큼 고민의 대상이 안되기 때문입니다. 개발자가 프로젝트를 할 때 주어진 정보를 가지고 할 수 있다? 없다?를 고민한 후, 할 수 있을거 같을때 문의를 드리는데, 주어진 정보가 너무 적기 때문에, 있다/없다의 수준이 아니라 그냥 고민의 대상이 아니게 되는거죠. 레드햇님 입장에서는 그런거를 문의하시면 답해드리겠다고 하지만, 그런 문의하는 게 싫은거(+ 귀찮은거)죠. 괜히 문의 했다가 이리저리 엮여서 하게 될거 같기도 하고, 일반적으로 개발자의 일이 아니라 영업직이 하는 일까지 고민하면서 일을 맡고 싶지도 않고,... 제가 할 수 있는 일이 아니라서 디테일하게 어떤 정보가 더 있어야 하는지 모르겠지만, 생각나는거만 기재해주시면 그래도 고민하는 사람이 더 많아지지 않을까 생각됩니다. 1. 작업 환경이 재택이 가능한지? 아니면 출퇴근이 반드시 필요한건지? 저장공간을 AWS를 쓴다면 그래도 재택으로 가능할텐데, 로컬에서 돌린다고 하셨던게, 데이터서버까지 로컬이라면 최소한 어느 정도 기간은 출퇴근이 필요한데, 어떤 상황인지 알 필요가 있습니다. 2. 글 마지막에 빨리처리해야 하는 일이라고 하셨는데, 그 기간이 대략 얼마인가요? 단발성 프로젝트이기 때문에, 비용은 둘째 치고라도 다른 일 하면서 알바로 하거나 아니면 잠시 이직이나 쉬는 사이에 해야합니다. 연말이라서 업무적으로 바쁜 사람도 많을테고, 개인적인 약속도 많을텐데, 기간이 짧다면 할 수 인원이 그만큼 적어지겠죠. 3. 비용적인 부분입니다. 실질적인 상황에 따라서 비용이 조율 되겠지만, 협상이 어디서 부터 시작할지 알아야지 고민이 대상이 될테니까요.. '수고비 수준으로 할 생각 없다. 원하시는 금액을 제시해달라'고 하셨는데, 금액을 먼저 제시하지 않는게, 협상에서 우위를 점하는 가장 손쉬운 방법이긴하죠. 그런데, 이건 유사한 프로그램이 없기 때문에 비교군도 없어서 금액정하기가 어려운면이 있고, 그럼 개발자 입장에서는 본인 몸값과 작업기간을 고려해서 먼저 제시하게 됩니다. 그런데 높게 부르면 그냥 한소리 들을거 같고, 작게 부르면 싼값에 해주는거라 생각되고, 이리저리 고민되는거죠. 그런 고민 까지 하고 싶은 개발자는 별로 없습니다. 이건 일반적인 프로젝트에 대한 문의 입니다. 보통은 개발언어나 개발환경인데 이건 크게 관계 없을거 같아서 제외해도 될거 같구요... 어쨋든, 이정도 정보는 있어야지 고민의 대상이 됩니다. 고민의 대상이 되어야지 할 수 있을 만한 분이 나와서 이 프로그램에 필요한 추가적인 문의를 하게 되는 거구요. 물론, 이런 정보 없이 프로그램을 발주하고 수주하는 경우도 있습니다만,.... 그 경우에는 다른 비교군이 많아서 일반적인 통념으로 생각되거나, 저연차에서도 할 수 있을 법한 쉬운 일인 경우이구요. 이 프로그램은 유사프로그램이 없어서 비교군이 없을 뿐더러, 저연차에서 할만한 일이 아닌, 어느 정도(억단위 이상의 데이터 처리를 많이해 본) 능력이나 경력이 있는 분들이 할 법한 일이기 때문에, 할 수 있는 사람 자체가 많지않을테니, 이런 정보를 먼저 제시하시는게 좋을듯합니다. 그래야 개발 가능하신 분들 중에 문의드릴 확률이 올라가지 않을까 생각됩니다.

레드햇 / 2019-12-05 23:32

alinux님 너무 감사드립니다... 저두 일때문에 바로 댓글을 못보고 지금보고 있네요... 그리고 다시 쥐어짜서 1억건 조합 밑으로 걸러보고 있습니다.. 이정도면 로컬에서 돌릴만 하겠죠?? 여라님도 댓글 너무나 감사드립니다... 제가 다시 정리해서 한번 요청드려볼 생각입니다.. 감사합니다...

dev_2 / 2019-12-09 14:22

일단 난이도는 데이터량 빼고는 어려운게 없는건 맞습니다만.. 질문하실때도 그렇지만 못하면 님 초보? 이런 태도로 사람들 판단하는거보고 의뢰를 받고 싶을까요? 해보실래요? 안하시면 초보인가? 쉽다면서요? 이런 마인드부터 바꾸시길 바랍니다. 다들 이미 하는 일이 있고 의뢰를 받으려는 사람들이 아닌데 말이죠 ㅎㅎ 초보도 다 할 수 있는건 맞는데 시간이 적게 드는건 아닙니다^^.

레드햇 / 2019-12-09 23:49

댓글을 우선 잘 읽어 보시길 바랍니다.. 제가 초보 취급한 글이 있던가요?? 초보라도 할 수 있겟다는 댓글이 있을 뿐입니다.. 댓글 안 읽어 보시고 넘겨짚고 말씀하시는 마인드부터 바꾸실길 바랍니다.. ^^