CPU를 최대한 활용하는 법 질문 드립니다.

   조회 5244   추천 1    

안녕하세요


2CPU에서 신세 지고 있는 노성훈 입니다.




AMD 16 Core CPU가 4개 붙어있는 PC로 작업을 하고 있습니다.

작업은 PDF에서 원하는 데이터를 뽑아내는 작업으로

C#을 이용해서 정규식으로 값을 추출하고 있습니다.

한 PDF에서 뽑아내는 값은 42개 입니다.


한개 PDF를 파싱하는데 7초 정도 걸리는데요

값을 뽑아내야하는 PDF의 숫자가 60000개 정도 되서

CPU를 최대한 활용해야 빨리 일이 끝날텐데 (대강 계산해 보니 100시간 좀 넘게 걸리네요 )

Multithread를 사용해도, palleral for 문을 사용해도

평균 CPU 사용량을 50% 넘기기가 힘듭니다.


지난번에 2CPU 덕분에 풀뱅크 해서 램도 여유있어서

램이랑 CPU를 더 팍팍 일 시키고 싶은데

더 좋은 방법이 없을까요?


프로그램을 잘 못하다 보니 좋은 컴퓨터를 구해 놓고도

완전히 다 쓰는게 쉽지 않네요 ㅠㅠ


짧은글 일수록 신중하게.
eondoo 2016-07
프로그램 자체에서 지원해야 하는 것 아닐까요?
     
nshhsn 2016-07
그 프로그램을 제가 만들어야 해서요 ㅠㅠ
김제연 2016-07
pdf가.. 중요한 자료가 아니라면.. 샘플로 하나 받아볼 수 있을까요? ^^ 궁금하기도 하고 .. 저도 한번 해보고 싶어서요 ..
그리고 .. 이전 글과 같이 100시간 이어도 . 이게 딱 한번만 이뤄지는 것이면 그냥.. 쓰시는 것도 괜찮을것 같네요
매번 빈번하게 발생하면.. 다른 방법을 써야겠지만요.
     
nshhsn 2016-07
파싱할 문서는 재무제표 입니다
형태가 일정하면 괜찮을 텐데
회사마다 형태가 다양해서 어려움이 많네요

자료는 첨부 파일로 올리겠습니다
김제연 2016-07
와우.. 주식 하시는 분 같으신데 .. 재무 재표 .. 6만개 회사면... 다 잘 정리하면 이것도 꽤 괜찮은 DB가 되겠네요.
     
nshhsn 2016-07
데이터 파는 회사 들이 있는데
두군데 것을 구해서 비교해 보니
두개가 다른게 꽤 많더라구요
실제 재무제표랑 숫자도 안 맞고요
고민하다가 직접 하고 있습니다

그래도 최근 데이터는 포멧이 통일 된것 같아서
다행이에요
          
NeOpLe 2016-07
정말 고생이 많으 시네요 ㅜ
               
nshhsn 2016-07
잘 안될 때가 많지만 재미 있어서 하고 있습니다 : )
     
nshhsn 2016-07
덧글에다가 파일 올려 놓았어요
한번 보셔요 ^^
충분히 multi-thread화 했는데도 CPU가 50% 쯤 논다면 그건 아마 I/O wait 때문일 것 같습니다. 그렇다면 계속 100%를 유지할 만큼 thread를 더 많이 만드는 것도 한 가지 방법이고.. 메모리가 충분해서 전체 문서를 다 올려놓을 만큼 큰 ramdisk를 만들 수 있다면 ramdisk를 이용해서 I/O wait 자체를 많이 줄일 수 있을 것 같은데요. 그리고 Windows를 잘 몰라서 file I/O를 어떤 방식으로 하시는지 모르겠는데.. file I/O 전용의 API보다 memory mapping 방식을 사용하시면 일반적으로 더 빠릅니다.
     
nshhsn 2016-07
감사합니다
코어가 64 개여서 스레드를 64개만 만들었는데
조금 더 늘여 봐야겠네요

램 디스크도 같이 시도해 보겠습니다
          
화란 2016-07
스레드를 '로지컬' 코어 갯수 - 1 만큼 만들어 보세요.

그럼 CPU가 비명을 지를겁니다^^
               
nshhsn 2016-07
AMD 는 코어 히나당 스레드 하나로 알앗는데 다를 수도 있을까요?

로지컬 코어 수도 계산 해 봐야겠네요

감사합니다
                    
딸기대장 2016-07
갸웃....
hw 쓰레드랑 sw 쓰레드랑은 틀리지 않나요?
두세배 더 만들어도 상관없을 껀데요?
생성되는 프로세스와 종료되는 프로세스의 차이도 있습니다..
1초안에 1만개 프로세스가 만들어지는것은 아니잔아요..
처음 생성된 프로세스가 다음 생성된 프로세스 시작되기까지의 시간처를 계산해보시면 대충 나올듯 합니다..
50% 까지 동작을 한다면 정말 잘돌아가는것이라고 봐집니다..
     
nshhsn 2016-07
프로세스 생성 시간에 의한 한계도 존재 히겠군요
무한정 올라기지는 읺겠네요
감사합니다
회원K 2016-07
disk i/o를 높여야 하지 않을까요?
     
nshhsn 2016-07
디스크를 별로 안 좋은걸 쓰고 있기는 합니다
램 디스크도 해 보게 생겼네요 : )
          
회원K 2016-07
disk i/o가 은근히 큰 딜레이가 되기 때문에
계산 프로그램은 disk i/o를 최소로 해야 합니다.
하셀호프 2016-07
램이 충분하면 램디스크 만들어서 사용하면 어떨까요
화란 2016-07
Multi-Thread를 어떻게 구현했는지는 잘 모르겠는데요...

멀티쓰레드로 돌렸는데요 50% ? 면... 데드락 검사는 하셨겠고...

waiting이 오래 걸리는게 아닐까요 ??

소스 함 올려보세요 ㅋ
무아 2016-07
스샷을 보면...
빌드를 디버그 모드로 하셨는데 릴리즈 모드로 빌드해서 해보세요.
송진현 2016-07
웹 크롤러를 만들어본 경험으로
디스크에서 READ WAIT타임이 상당이 성능에 영향을 줍니다..(저는 디스크 WAIT가 아닌 네트워크 WAIT이였습니다..)
그래서 READ 쓰레드와 파싱 쓰레드를 별도로 두고 메모리위에서 처리하면 처리 속도가 극대화 대더라구요..
예를들면.. READ와 WRITE, PARSER1, PARSER2, CONTROL이 있다고 칠때..
PARSER1과 PARSER2는 동일한 쓰레드의 갯수입니다. PARSER1이 일할때 PARSER2는 일하지 않고 PARSER2가 PARSER1이 일할때 일하지 않습니다.
초기화 단계에서는 READ가 PARSER들의 쓰레드 갯수만큼 데이터를 읽어둡니다.(PARSER1과 PARSER2의 쓰레드의 갯수는 같습니다.)
CONTROL은 PARSER1에게 READ가 읽어온 데이터를 넘겨주고 READ에게 다음작업을 시킵니다.(PARSER2가 할작업)
CONTROL은 READ의 끝을 감지하고 PARSER2에게 데이터를 넘겨줍니다.
CONTROL은 PARSER1의 작업의 끝을 감지하고 PARSER2를 작동시키고
PARSER1들은 WRITE에게 데이터를 넘겨주고 데이터를 정리하여 저장합니다..
위와 마찬가지 방법으로 PARSER1을 준비시킵니다..

제가 작성하고도 어렵네요..


QnA
제목Page 2612/5711
2015-12   1698278   백메가
2014-05   5164107   정은준1
2006-10   5155   이문흠
2021-03   5155   FreeBSD
2020-01   5155   Special
2015-05   5155   일론머스크
2021-01   5155   PINGFAIL
2017-09   5155   시골집노안
2006-01   5155   김정식
2012-03   5155   방o효o문
2005-11   5155   임영수
2015-10   5155   2cpumem
2012-08   5155   김황중
2008-03   5155   이제호
2007-09   5155   정도영
2007-03   5155   박태선
2005-11   5155   서경주
2013-02   5155   나우마크
2007-04   5156   윤호용
2013-10   5156   회로쟁이
2006-11   5156   최승혁
2007-09   5156   계유찬