2012-03-17 2 views
0

grep 명령을 사용하여 SQL 파일을 처리하는 프로그램을 작성하고 싶습니다. 작동 할 때 모든 코어를 사용할 수 있기를 바랍니다. MPI 또는 Pthreads를 사용하는 것은 중요하지 않습니다. 그러나 파일을 4 개의 파일로 나누려면 어떻게해야합니까? 만약 내가 700mb 크기의 txt 파일을 가지고 있다면, 모든 스레드가 그 파일의 1/4을 처리하는 방법을 의미합니다.grep 테스트를 병렬 작업으로 나누는 방법

필자는 필자가이 파일의 몇 줄을 쓰레드마다 다른 파일 오프셋을 설정해야하는지 알고 싶습니다. 그것은 좋은 방법이고, 전체 라인 수를 얻는 방법입니까?

아마 파일 시간이 오래 걸릴 것입니다 얼마나 많은 줄 수 :

[email protected] ~ % time wc -l lineitem.tbl 
6001215 lineitem.tbl 
wc -l lineitem.tbl 0.20s user 0.40s system 4% cpu 12.996 total 
+0

'wc -l'이 얼마나 오래 걸릴지 테스트하기가 어렵지 않습니다. 즉, 줄 수를 반환해야합니다 (예 : 얼마나 걸리나요?) –

+0

[GNU 병렬] (http://en.wikipedia.org/wiki/GNU_parallel)과 같은 것을 찾고 계십니까? – Pascal

+0

@JonasWielicki 시간이 오래 걸릴 것입니다. 내 질문을 편집하고,'wc -l '이 걸리는 시간을 추가하면된다. 감사합니다 ~ – madper

답변

2

당신이 원하는 것은 매우 쉬운 일이 아닙니다. 이와 같은 문제를 처리하기 위해 Google의 MapReduce 및 Apache Hadoop과 같은 프레임 워크가 만들어졌습니다. 일반적인 경우 임의의 큰 파일을 임의의 병렬 처리로 분할하는 것은 어려운 문제이므로이 작업을 위해 전용 프레임 워크를 사용하는 것이 가장 좋습니다. 그러나 귀하의 경우에는 매우 구체적인 요구 사항이 있으므로 다음과 같이 할 수 있습니다.

파일을 N 개의 청크로 분할합니다 (N = 코어 수). 물론 이것은 라인 경계를 존중하지 않으므로 각 분할에서 다음 줄 문자를 검색하는 "스플리터"루틴이 필요합니다. (이 작업은 옳고 겹치는 것을 방지하는 것이 까다로울 수 있지만 기본적으로 Hadoop 또는 MapReduce가 수행하는 작업입니다.) 그러면 각 청크를 병렬로 처리 할 수 ​​있습니다.

물론 이것은 생각만큼 효과적이지 않을 수 있습니다. 전체 파일이 메모리에 맞지 않으면 I/O 문제가 발생합니다. CPU 사용을 병렬화한다고해서 I/O를 병렬화한다는 것을 의미하지는 않습니다. 이것이 분산 처리 프레임 워크가 일반적으로 여러 하드 드라이브 또는 클러스터 노드로 데이터를 분할하는 이유입니다.

+0

대단히 고마워요! 나는 지금 시험해 볼 것이다. 나는이 파일을 메모리에로드하는 것을 피하기 위해 다른 파일 오프셋을 설정할 수 있다고 생각한다. – madper

3

우선, 프로그램의 I/O 제한 사항과 같은 런타임 통계가 나타납니다. 엄청난 양의 예비 CPU가 있습니다. 따라서 CPU 부분을 병렬로 만드는 것은 많은 긍정적 인 효과를 내기 어렵습니다. 사실 디스크 캐싱이 덜 효과적 일 수 있기 때문에 상황이 악화 될 수 있습니다. 그는 문제 (스캐닝 시스템 로그)의 유사한 종류를 조사하기 위해 많은 사람들의 도움을 얻었다 일부를 찾을 수 있도록 http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder

에서 팀 브레이 (Tim Bray)에 의해 유사한 문제 해결에 긴 실행 시리즈가 발생했습니다

준비가 도와 줬어.

+0

귀하의 조언에 감사드립니다 ~ : D – madper

+0

대단히 영광입니다. 나는 당신이 솔루션을 조사하는 재미를 보길 바랍니다. – gbulmer

+0

파일에서 데이터를 읽는 데 쓰레드 만 만들 수 있습니다. 그런 다음 데이터를 세 개의 버퍼에 넣고 세 개의 스레드를 만들어 데이터를 처리하십시오. 디스크 캐싱 적중률 감소를 피할 수 있기를 바랍니다. – madper

관련 문제