2012-06-25 5 views
1

나는 멀티 스레드 응용 프로그램을 작성 중이며 지금은이 아이디어를 가지고 있습니다. 나는 FILE*[n]을 가지고 있는데, n은 런타임에 결정된 숫자입니다. 독서를 위해 n 개의 파일을 모두 열면 여러 스레드가 읽을 수 있습니다. 각 파일의 데이터에 대한 계산은 동일하다. 즉, 직렬 실행이 가정되면 각 파일은 동일한 시간 동안 메모리에 남아있게된다.C에서 파일에 쓰는 동안 디스크 액세스 횟수 줄이기

각 파일은 임의로 커질 수 있으므로 메모리에로드 할 수 있다고 가정해서는 안됩니다.

그런 시나리오에서 나는 발생하는 디스크 IO의 수를 줄이려고합니다. 어떤 시나리오가 구현 된 방법에 대한 아이디어가 거의 없기 때문에 누군가이 시나리오를위한 공유 메모리 모델을 제안 할 수 있다면 좋을 것입니다. 다른 말로하면 나는 단지 그러한 시나리오를 구현하는 가장 효율적인 모델이 무엇인지 알고 싶다. C을 사용하고 있습니다.

EDIT : 더 자세한 시나리오.

실제 문제는 n 파일에 포함 된 데이터에 n 블룸 필터가 있고 파일의 모든 요소가 해당 블룸 필터에 삽입되면 회원 테스트를해야합니다. 멤버쉽 테스트는 데이터 파일의 읽기 전용 프로세스이기 때문에 여러 스레드에서 파일을 읽을 수 있으며이 문제는 쉽게 병렬 처리 할 수 ​​있습니다. 이제 데이터가있는 파일의 수는 꽤 큽니다 (약 20k이고 파일 수는 블룸 필터의 수와 같습니다) 그래서 블룸 필터 테스트를 위해 스레드를 생성하도록 선택합니다. 즉 각 블룸 필터는 자체 스레드를 가지며 다른 모든 파일을 하나씩 읽은 다음 블룸 필터에 대한 데이터 멤버십을 테스트합니다. 나는 그런 경우에 디스크 IO를 최소화하기를 원합니다.

+0

어떤 플랫폼에 대해 이야기하고 있습니까? Linux를 사용하는 경우 가장 쉬운 방법은 메모리 매핑 파일로 열어서 OS가 처리하도록하는 것입니다. (나는 Windows에 상응하는 것이 있다고 확신한다.) –

+0

나는 리눅스를 사용하고있다. 좀 더 설명해 주시겠습니까 –

+0

공유 메모리를 통해 공유하려고하는 것이 확실하지 않습니까? 메모리 맵핑 된 파일을 생각하고 있다면, IO는 필연적으로 IO를 줄이지 않습니다 (여전히 읽어야 할 모든 것을 읽어야합니다). IO가 문제라고 생각하는 이유는 무엇입니까? 의미있는 제안을하기에 충분한 세부 사항이 없다고 생각합니다 ... 질문 제목에 파일 작성에 대한 언급이 있지만 본문에 파일이 쓰여지는 방법 및 위치에 대한 언급이 없습니다. John3136

답변

3

처음에는 FILE *을 열거 나 읽지 않고 파일을 메모리에 매핑하기 위해 mmap() 함수를 사용하십시오. 그런 다음 파일을 읽는 스레드를 생성합니다. 그런 식으로 OS는 메모리에 액세스를 버퍼링하고 캐시가 가득 차면 디스크 io 만 수행합니다.

0

프로그램이 다중 스레드 인 경우 스레드 로컬 저장소를 만드는 단계를 수행하지 않으면 모든 스레드가 메모리를 공유합니다. o/s 공유 메모리가 직접 필요하지 않습니다. I/O를 최소화하는 방법은 가능한 한 각 파일을 한 번만 읽게하고 결과 파일을 한 번만 쓰도록하는 것입니다.

당신이하는 일은하는 일에 달려 있습니다.

f 각 스레드가 파일 전체를 처리해야하는 경우 스레드는 단순히 파일을 읽습니다. I/O를 줄일 수는 없습니다. 파일을 여러 스레드에서 읽어야하는 경우 파일을 메모리 맵핑하여 모든 관련 스레드에서 사용할 수 있도록해야합니다. 32 비트 프로그램을 사용하고 있고 파일이 너무 커서 메모리에 모두 들어 가지 않는 경우 반드시 메모리 매핑을 수행 할 필요는 없습니다. 그런 다음 다른 스레드가 각 파일을 처리하는 방법을 고안하고 다른 스레드가 파일을 다시 읽어야하는 횟수를 최소화하려고 노력해야합니다. 64 비트 프로그램을 사용하는 경우 메모리 매핑 I/O를 통해 모든 파일을 처리 할 수있는 가상 메모리가 충분할 수 있습니다. 여전히 데이터에 액세스하는 횟수를 최소로 유지하려고합니다. 유사한 개념이 출력 파일에도 적용됩니다.

관련 문제