문제

VB6과 Win32 API를 사용하여 파일에 데이터를 작성하고 있습니다.이 기능은 데이터를 내보내기위한 것이므로 디스크에 성능을 쓰는 것이 고려 사항의 핵심 요소입니다. 따라서 나는 사용 중입니다 FILE_FLAG_NO_BUFFERING 그리고 FILE_FLAG_WRITE_THROUGH 호출로 파일을 열 때 옵션 CreateFile.

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

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

도움이 되었습니까?

해결책

확실하지 않지만 file_flag_no_buffering 및 file_flag_write_through를 최대한 활용한다고 확신하십니까?

그들은 당신의 데이터가 가능한 빨리 디스크에 도달하게 될 것이지만, 그런 종류의 일은 실제로 성능에 도움이되지 않습니다. 그것은 당신이 가능한 한 가능한 한 완전하고 싶은 저널 파일과 같은 것들에 대한 신뢰성에 도움이됩니다. 충돌.

설명과 같이 데이터 내보내기 루틴의 경우, 운영 체제가 데이터를 완화시킬 수있게하면 데이터가 더 나은 성능을 제공 할 수 있습니다. 쓰기는 다른 디스크 활동에 따라 일정이 예정되어 있기 때문입니다. .

옵션없이 코드를 벤치마킹하지 않겠습니까? 0 바이트 패딩 논리를 남겨 두어 공정한 테스트를하십시오.

해당 옵션을 건너 뛰는 것이 더 빠르면 0 패딩 로직을 제거 할 수 있으며 파일 크기 문제가 자체적으로 수정 될 수 있습니다.

다른 팁

나는 설정 오프가 유일한 방법이라고 믿는다.

그리고 나는 Mike G에 동의합니다. file_flag_no_buffering이 있거나없이 코드를 벤치해야한다는 것에 동의합니다. 최신 OS의 Windows 파일 버퍼링은 매우 효과적입니다.

글쎄, 나는 놀랐다! 직접 수행하는 대신 Windows 버퍼링을 사용합니다. 많이 더 빠르게. 나는 내 자신의 버퍼와 FILE_FLAG_NO_BUFFERING 그리고 FILE_FLAG_WRITE_THROUGH 옵션은 평균 21.146 초가 걸렸으며, 이러한 설정없이 Windows 버퍼를 사용하지 않고 평균 시간은 13.53 초로 떨어졌습니다. 이는 30% 이상 더 빠릅니다!

자기 주목 : 휠을 재발 명 할 필요가 없습니다. ;-)

고맙습니다 '마이크 g'신속하고 정확한 답변을 위해. 그리고 당신에게도 감사합니다 'Gabr', 귀찮게 할 필요가 없습니다 SetEndOfFile 전혀 지금.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top