2008-09-29 3 views
2

VB6 및 Win32 API를 사용하여 데이터를 파일에 쓰는 중입니다.이 기능은 데이터 내보내기 용이므로 디스크에 쓰기 성능이 내 고려 사항의 핵심 요소입니다. 따라서 CreateFile을 호출하여 파일을 열 때 FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH 옵션을 사용하고 있습니다.FILE_FLAG_NO_BUFFERING으로 열린 파일의 끝 부분을 어떻게 써야합니까?

FILE_FLAG_NO_BUFFERING은 내 자체 버퍼를 사용하고 디스크 섹터 크기의 배수로 파일에 데이터를 쓰도록 요구합니다. 데이터의 마지막 부분을 제외하고는 일반적으로 문제가되지 않습니다. 섹터 크기는 문자 0의 파일 밖 패딩을 포함 할 것입니다. 마지막 블록이 이러한 문자 0을 포함하지 않도록 작성되면 파일 크기를 어떻게 설정합니까?

SetEndOfFile을 사용할 수 있지만 FILE_FLAG_NO_BUFFERING을 사용하지 않고 파일을 닫은 다음 다시 열어야합니다. 나는 누군가가 VB4에서 이것을 사용하고 선언하는 방법을 찾을 수없는 NtSetInformationFile에 대해 이야기하는 것을 보았다. SetFileInformationByHandle 정확히 원하는대로 할 수 있지만 Windows Vista에서만 사용할 수 있으며 내 응용 프로그램은 이전 버전의 Windows와 호환되어야합니다.

답변

1

확실하지 않지만 FILE_FLAG_NO_BUFFERING 및 FILE_FLAG_WRITE_THROUGH를 설정하면 최대 성능을 얻을 수 있습니까?

그들은 데이터를 가능한 한 빨리 디스크에 저장하지만 결과적으로 실제로 성능에 도움이되지는 않습니다. 가능한 한 완벽 해지고 싶은 저널 파일과 같은 안정성에 도움이됩니다 사고가 났을 때.

설명하는 것처럼 데이터 내보내기 루틴을 사용하면 운영 체제가 데이터를 버퍼링하도록 허용하면 쓰기가 다른 디스크 활동과 일렬로 이루어지기 때문에 성능이 향상 될 수 있습니다. 귀하의 모든 파일 쓰기.

옵션없이 코드를 벤치 마크하지 않는 이유는 무엇입니까? 공정한 테스트를 위해 0 바이트 패딩 로직을 남겨 둡니다.

이러한 옵션을 건너 뛰는 것이 더 빠르면 0 패딩 논리를 제거 할 수 있으며 파일 크기 문제가 자체적으로 수정됩니다.

+0

매우 흥미로운 점은 파일을 작성하는 다양한 방법을 벤치마킹하려는 것이지만 그럼에도 불구하고 제안에 감사드립니다. 이 방법을 시도하게 된 동기는 winasm.net의 블로그 게시물 (http://www.winasm.net/forum/index.php?showtopic=794)이었습니다. – AnturCynhyrfus

+0

이 특별한 경우에 맞을 수도 있지만 그 질문에 대한 답은 아닙니다. –

+0

Marvin, 음, 네, 질문에 대답하지 않았습니다 (gabr이 그렇게했습니다). 그러나 근본적인 문제를 해결하고 프로세스 속도를 높였습니다. :) –

2

저는 SetEndOfFile이 유일한 방법이라고 생각합니다.

그리고 Mike G.는 FILE_FLAG_NO_BUFFERING 사용 여부에 관계없이 코드를 벤치해야한다고 동의합니다. 최신 OS에서의 Windows 파일 버퍼링은 꽤 효과적입니다.

+0

답변의 나머지 질문에 대답하지 않습니다. – AlexPi

1

음 놀랍습니다. Windows 버퍼링을 직접 사용하는 대신에 MUCH이 더 빠릅니다. 나는 자신의 버퍼를 사용하여 테스트 할 1GB의 파일을 작성했으며, FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH 옵션은 평균 21.146 초가 걸렸으며, Windows 버퍼를 사용하는 평균 시간은 13.53 초로 30 % 이상 빨라졌습니다!

참고 사항 : 휠을 다시 발명 할 필요가 없습니다. ;-)

감사합니다. 마이크 G '은 신속하고 정확한 답변입니다. 그리고 너에게 또한 'gabr'덕분에, 지금 전혀 SetEndOfFile을 귀찮게 할 필요가 없다.

1

1GB 파일의 경우 Windows 버퍼링이 실제로 더 빠를 것입니다. 많은 작은 IO를 수행하는 경우.사용 가능한 RAM보다 훨씬 큰 파일을 처리하고 대형 블록 IO를 수행하는 경우 설정 한 플래그가 더 나은 처리량을 필요로합니다 (스레드 및/또는 무작위 대형 블록 IO의 경우 최대 3 배 빠름).

관련 문제