2012-05-04 2 views
3

내 질문은 How to avoid hard disc fragmentation?과 비슷하지만 하루에 수 백 개의 파일을 생성하므로 크기가 2MB에서 100MB가 넘을 수 있습니다. (질문자는 디스크를 어수선하게 만드는 것에 대해 더 걱정할 필요가 있다고 생각했습니다. 문제는이 파일을 읽는 성능입니다.) 이 파일들은 한 번에 조금씩 작성되어 (데이터 로깅) 조각화를 만드는 가장 좋은 방법입니다. 데이터베이스는 옵션이 아닙니다. 완전히 작성된 후에 조각 모음을 수행하는 코드가 있지만 파일을 다시 읽는 동안 성능이 저하됩니다.수백 메가 바이트 파일을 작성하는 동안 파일 조각화를 피하는 방법은 무엇입니까?

그 방법은 How can I limit file fragmentation while working with .NET?으로 제안됩니다. 그 (것)들은 세부 사항에 짧다 (및 나는 C++에있다). SetFilePointerEx() 및 SetEndOfFile()을 사용하여 파일의 크기를 2MB로 설정하고 파일이 할당 된 크기에 도달하면 관찰 된 증가 속도를 기준으로 크기를 조정합니다. 그런 다음 쓰기가 완료되면 실제 데이터 크기로 크기를 조정하십시오.

내가 본 함정 하나 (실제로는 http://www.cplusplus.com/forum/windows/22114/)는 내 응용 프로그램이 충돌하거나 컴퓨터가 종료 될 경우 이 발생합니다. 이제 파일에서 미정의 데이터를 얻었으므로 Windows를 통해이를 탐지 할 수 없습니다. 이것은 파일 하나 하나에 하나의 파일로 얼마나 많은 데이터가 기록되었는지 추적하는 파일을 제안합니다. 더 나은 전략이 있습니까? 아마도 각 쓰기 후에 충분한 0을 쓰면 나중에 감지 할 수 있습니다 (그리고 나서 다음 쓰기를 준비 할 수 있도록 백업)?

내가 놓친 다른 잡화가 보이니?

답변

2

사전 할당 방법을 사용하여 파일 크기를 500MB 단위로 늘립니다. 비디오 데이터이기 때문에 우리는 마지막 (유효하다고 생각되는) 데이터가 언제 읽혀 지는지 검증 할 수있는 별도의 인덱스 파일도 저장합니다.

데이터가 텍스트 인 경우 조금 더 고통 스러울 수도 있지만 null 데이터를 무시하고 끝에 2MB 경계로 건너 뛰어도됩니까?

+0

이진 데이터입니다. 이것은 구현의 용이성을 위해 공간을 (적어도 단기간) 희생시키는 아이디어입니다. SetEndOfFile() API를 사용합니까? 웬일인지, 그것은 나를 긴장하게한다. – MrPhilTX

+0

예,'SetFilePointerEx()'와 함께. – Deanna