2009-10-13 4 views
0

큰 파일로드의 결과가 더 빨리 얻어지는 NTLinux에 대한 프로그래밍 방식의 휴대용? 나는 당신이 그것을 두 개의 OS에 대한 코드에서 제어 할 수있는 메커니즘이라고 부르는 것이 무엇이든간에, '이전에'앞서있다.사용자 정의 프리 페치

각 파일은 크기가 완전하고 내용이 순차적이어야합니다. 목표는 배치 파일 처리 속도를 높이는 것입니다.

답변

2

madvise()과 비슷한 Win32 (NT) API는 알지 못합니다.

그러나 접근 방법을 제안합니다.

먼저 Win32 플래그 FILE_FLAG_SEQUENTIAL_SCANCreateFile()으로 전달합니다. 이렇게하면 Windows 운영 체제가 파일을 열어 파일을 더 잘 버퍼링 할 수 있습니다.

FILE_FLAG_SEQUENTIAL_SCAN을 사용하면 파일을 메모리에 저장하면 파일 파서가 더 빨리 작동 할 수 있습니다. Linux의 madvise()과 달리 Win32 플래그를 사용하기 때문에 파일이 메모리에로드되기 시작하지 않습니다.

다음으로로드를 시작하려면 파일을 트리거해야합니다. 비동기식으로 파일의 첫 번째 페이지를 으로 호출하고 OVERLAPPED 구조와 FileIOCompletionRoutine 함수를 호출합니다.

FileIOCompletionRoutine은 단순히 반환 할 수도 있고, 중첩 된 구조로 이벤트를 설정할 수도 있습니다. 자세한 내용은 ReadFileEx의 MSDN 세부 정보를 읽으십시오.

실제로 파일을 읽을 때 미리 가져 오기가 완료되지 않은 경우 중요한 실패가 아니므로 가장 쉽게 구현할 수 있습니다. "꺼내기"- 중복 된 파일을 읽은 다음 결코 실행하지 않습니다. 그 결과를 확인하십시오. 그래도 데이터를 유효한 버퍼로 읽어야합니다! 이전 파일을 읽는 동안 당신이 파일에 대해이 작업을 수행 할 경우

는, 결과는 다음 파일에 페이징 시작됩니다 것을해야한다.

이 당신의 성능이 저하 될 수 있음을 유의하십시오. 다음 파일로 페이지가 시작될 때 해당 파일에 액세스 할 디스크 I/O는 현재 구문 분석중인 파일에 대한 디스크 I/O와 경쟁하게됩니다. 두 파일이 동일한 디스크에서 서로 물리적으로 멀리 떨어져있는 경우 드라이브 헤드가 찾는대로 사전 불러 오기의 결과가 추가 지연 될 수 있습니다. 최신 드라이브에는 이러한 문제를 완화하는 대용량 버퍼가 있지만 새 파일의 첫 페이지를 대기열로두면 헤드 검색이 발생할 수 있습니다.

bdonlan이 처리에서 비동기 적으로 파일을로드하는 'pre-fetch'스레드는 Win32에서도 사용할 수있는 솔루션입니다.

+0

당신의 의견 모두를 위해 건배 .. file_flag_sequential 및 제안 된 기술을 알고 있지만, 남아있는 내용에 대한 명시적인 제어가 있는지 궁금해하고 있습니다 : Prefetch를위한 XP + OS-es이므로 SuperFetch 및 다른 형식으로 말합니다 :) Kind of NT에서 분명히 작동하는 것처럼, 리눅스를 사용하는 방법이 없다면 부끄러운 일이 될 것입니다. 그럼에도 불구하고 나는 명백한 통제를 찾았지만 아무런 도움이되지 못하여 무언가를 잃어 버렸을지도 모른다. 대답을 받아들이거나 제안을하기 전에 하루 동안 질문을하게 할 것이다. 고마워. –

+0

나는이 경우 SuperFetch가 "pre-fetch"스레드보다 조금 더 많을 것이라고 생각한다. 그것은 스레드가 아닌 전체 프로세스이며 어떻게 든 OS에서 정보를 얻어서 결정을 내린다. 어떤 EXE 및 DLL 파일을 메모리로 가져올 지 결정합니다. –

+0

자고 난 후, 나는 Win NT에 관한 나의 대답을 확장했다. –

4

NT에 대해서는 잘 모르겠지만 Linux에서 한 가지 옵션은 MADV_WILLNEED 플래그가있는 madvise 플래그를 사용하는 것입니다. 잠시 후에 실제로 다음 파일을 읽는 것이 필요합니다.

대안 적으로 포터블 옵션은 버퍼 처리 스레드와 별도의 스레드에서 수동으로 readahead를 수행하는 것입니다. 즉, 스레드 A의 XMB 버퍼를 채우기 위해 데이터를 읽고, 스레드 B에서 수행 할 수 있습니다.

+0

예 .. 더 많은 휴대용 옵션은 기존의 버퍼링 또는 프리 페치 자격 메커니즘에 대해 OS를 (적정한 소비로) 강제 할 수 있습니다. 프로세스가 수명에 걸쳐 있기 때문에 스레드를 통해서가 아니라 이미 방법으로 활용하고 있습니다.따라서 OS에 대한 힌트에 대한 관심, 특히 파일의 대량 판매에 대한 관심. 감사와 upvoting 대답 모두. –

+2

당신은 여전히 ​​다른 프로세스의 수명에 걸쳐있는 별도의 프로세스에 넣고 공유 메모리에 데이터를 전달하는 readahead-thread 옵션을 사용할 수 있습니다. 그것은 더 복잡합니다. 물론 가능합니다. – bdonlan

관련 문제