대용량 파일(4GB)을 읽으려 합니다. 파일을 읽을 때 비동기 방식을 이용하여 읽기 시간을 단축하려고 합니다. CreateFile과 ReadFile를 이용하여 테스트한 결과 일반적인 방식(동기 방식)과 비동기 방식의 차이점이 없습니다.
아래의 코드와 같이 CreateFile을 이용하여 파일을 연후 ReaFile 을 이용하여 읽고 있습니다. 일반적인 방식(동기 방식)과 비동기 방식은 CreateFile에서FILE_FLAG_OVERLAPPED와 ReadFile에서 OVERLAPPED 구조체 사용만이 다릅니다.
궁금 사항
1. 비동기 방식 사용법이 잘못 된 것인가요?
2. ReadFile이 완료를 알기 위해 GetOverlappedResult를 사용하였는데 이 부분에서 비동기 방식의 이점인 논블록 효과가 없어집니다. 사용이 잘못 되었나요?
3. ReadFile의 경우 일반적인 방식(동기 방식)과 비동기 방식의 차이점이 없는 것인가요?(WriteFile의 경우 시간을 단축할 수 있었습니다. GetOverlappedResult를 사용안함.)
4. IOCP(CreateIoCompletionPort)를 이용하려고 합니다. 단일 파일의 경우 아래의 링크에서 효과가 없다고 하는데 사용하게 된다면 정말 효과를 볼 수 없을까요?
(
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=630180&ref=630161)
5. 실제 비동기적 효과를 보기 위해서는 가장 효과적이며 일반적인지 궁금합니다.
아래의 코드는 샘플 입니다. 형식은 상관없습니다.
--------------------------------------------------------------------------------------------------
비동기 방식 코드
--------------------------------------------------------------------------------------------------
HANDLE hFile = CreateFile(_T(“C:\4G_test”),
GENERIC_READ | GENRIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
OVERLAPPED cbOv = {0};
while(cbOv.offset < 파일 사이즈)
{
ReadFile(hFile, lpBuffer, uBufferSize, &dwRead, &cbOv);
if(GetLastError() != ERROR_IO_PENDING)
return FALSE; // ReadFile Error
GetOverlappedResult(hDevice, &cbOv, &dwRead, TRUE);
...
cbOv.offset += dwRead;
}
--------------------------------------------------------------------------------------------------
일반 방식(동기 방식) 코드
--------------------------------------------------------------------------------------------------
HANDLE hFile = CreateFile(_T(“C:\4G_test”),
GENERIC_READ | GENRIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
OVERLAPPED cbOv = {0};
BOOL bRead;
while(cbOv.offset < 파일 사이즈)
{
bRead = ReadFile(hFile, lpBuffer, uBufferSize, &dwRead, NULL);
if(!bRead)
return FALSE; // ReadFile Error
...
cbOv.offset += dwRead;
}
감사합니다.