2011-08-21 3 views
1

Windows ReadFile 함수를 사용하여 FILE_FLAG_NO_BUFFERING을 사용하여 4GB 파일을 순차적으로 읽습니다. 나는 64K의 버퍼를 사용하고 있으며 모든 것이 올바르게 작동하지만 문제는 현재 버퍼의 끝과 다음 버퍼 사이에서 데이터가 잘리는 문제입니다. 예를 들어, 4 바이트 플로트 숫자 시퀀스가 ​​있고 마지막 플로트에 도착하면 현재 버퍼에 3 바이트 만 있고 다음 바이트는 다음 읽기 버퍼에 저장됩니다. 그러면 어떻게 처리 할 수 ​​있을까요? 마지막 3 바이트를 유지하고 다음 버퍼를 읽은 후 마지막 바이트를 추가하기 위해 소비 한 바이트 수를 추적해야합니까? 또는 버퍼를 다른 곳에 복사하고 거기에 수레 추적을 만들 수 있습니까? 그러나 이것은 Windows 캐시를 읽지 않는 이점을 꺾지는 못합니까? 어떤 도움을 주셔서 감사합니다.ReadFile FILE_FLAG_NO_BUFFERING 두 섹터간에 데이터를 읽는 방법

답변

0

경계에있는 특수한 경우에는 이전 블록의 비트와 다음 블록의 비트를 나란히두고 작은 스크래치 공간에 복사해야한다고 생각합니다. 한 조각으로. 경계에 있지 않으면이 스크래치 공간을 사용할 필요가 없습니다.

0

버퍼링되지 않은 읽기가 정렬되어야하기 때문에 직접 계산해야합니다.

하지만 더 나은 질문은 왜이 작업을 수행해야한다고 생각합니까? 파일을 읽으려고 std::ifstream을 사용해 보셨습니까? 최신 프로세서와 캐시는 버퍼링 된 I/O가 수행한다고 생각되는 여분의 복사본을 숨기는쪽으로 (또는 사실상 제거하기 위해) 먼 길을 간다.

또한 순차적으로 읽는다면 FILE_FLAG_NO_BUFFERING은 OS의 미리 읽기 기계를 금지합니다. 이렇게하면 OS 버퍼를 우회하는 것보다 훨씬 많은 비용이 들게됩니다.

가장 간단한 코드는 대용량 파일을 순차적으로 읽는 데 가장 잘 작동 할 것입니다. 이것은 현대 시스템이 모든 레벨에서 최적화 된 경우입니다 ...

+0

답변 해 주셔서 감사합니다. FILE_FLAG_NO_BUFFERING에 대해 읽었으며 큰 파일을 읽을 때 좋습니다 (1GB 이상). 이 상황에서 캐시 관리자는 캐싱을 제대로 처리 할 수 ​​없습니다. 사실 FILE_FLAG_SEQUENTIAL_SCAN을 사용하여 ifstream 및 ReadFile을 시도했으며 속도가 15 %에서 20 %까지 느려지므로 파일을 읽고 처리하는 데 1 분 또는 그 이상의 시간이 소요됩니다. – Daniel

관련 문제