2010-05-16 2 views
6

나는 높은 파일 I/O 성능 (C# 사용)이 필요한 시스템에서 작업하고 있습니다. 기본적으로 파일 시작부터 파일 끝까지 대용량 파일 (~ 100MB)을 채 웁니다. ~ 5 초마다 ~ 5MB를 파일에 추가합니다 (파일의 시작 부분부터 순차적으로). 스트림을 플러시 할 때마다 대량으로로드됩니다. 몇 분마다 필자는 파일의 끝에 (어떤 종류의 메타 데이터) 쓰는 구조체를 업데이트해야합니다.파일 끝에 쓸 때

각 각을 플러시 할 때 성능 문제가 없습니다. 그러나 파일 끝에 메타 데이터를 업데이트 할 때 성능이 매우 떨어집니다. 내 생각 엔 파일을 만들 때 (너무 빨라야 함) 파일은 디스크에 전체 100MB를 실제로 할당하지 않고 메타 데이터를 플러시 할 때 파일 끝까지 모든 공간을 할당해야합니다.

남자/여자, 어떤 아이디어이 문제를 어떻게 극복 할 수 있습니까?

고맙습니다. 코멘트에서

: 일반적으로

먼저 파일을 열 때, 다음과 같은 코드는 말하기 :

m_Stream = new FileStream(filename, 
     FileMode.CreateNew, 
     FileAccess.Write, 
     FileShare.Write, 8192, false); 
m_Stream.SetLength(100*1024*1024); 

몇 초마다 나는 ~ 5메가바이트을 쓰고 있어요.

m_Stream.Seek(m_LastPosition, SeekOrigin.Begin); 
m_Stream.Write(buffer, 0, buffer.Length); 
m_Stream.Flush(); 
m_LastPosition += buffer.Length; // HH: guessed the += 
m_Stream.Seek(m_MetaDataSize, SeekOrigin.End); 
m_Stream.Write(metadata, 0, metadata.Length); 
m_Stream.Flush(); // Takes too long on the first time(~1 sec). 
+0

코드를 알려주십시오. – SLaks

+0

100MB를 미리 할당하고 _then_ 위치에서 시작하여 5MB 덩어리를 쓰는 것을 의미합니까? 그래서 최대 20 개의 청크가 있습니까? –

+0

안녕 헨크, 일반적으로 코드는 다음과 같습니다 (나는 여전히 코드를 포맷하는 방법을 이해하려고합니다).: 먼저 파일을 엽니 다. m_Stream = new FileStream (filename, FileMode.CreateNew, FileAccess.Write, FileShare.Write, 8192, false); m_Stream.SetLength (100 * 1024 * 1024); 매 초마다 ~ 5MB를 쓰고 있습니다. m_Stream.Seek (m_LastPosition, SeekOrigin.Begin); m_Stream.Write (buffer, 0, buffer.Length); m_Stream.Flush(); m_LastPosition _- buffer.Length; m_Stream.Seek (m_MetaDataSize, SeekOrigin.End); m_Stream.Write (metadata, 0, metadata.Length); m_Stream.Flush(); 처음 쓰기에 너무 오래; –

답변

2

(당신은 파일의 마지막에 메타 데이터가 있어야 가정) 첫 번째 물품.

2 개의 작업을 수행합니다 (희소가 아닌 파일이라고 가정). 1. 전체 파일의 전체 공간을 할당하십시오. 2. 공간이 준비되고 대기하면서 다음 쓰기 작업을 조금 더 빠르게 수행하십시오.

비동기 적으로 수행 할 수 없습니까? 적어도 응용 프로그램은 다른 것들로 이동할 수 있습니다.

0

AppendAllText 시도해 보셨습니까?

+0

빠른 답장을 보내 주셔서 감사합니다. 나는 이러한 대답을 얻는 것을 두려워했습니다 :-) 파일 끝이 아닌 다른 위치로 메타 데이터를 이동하는 것은 문제가 있지만 다른 옵션이없는 것처럼 보입니다. 감사합니다. 많은 사람들 –

+0

왜 Flush()를 부르시겠습니까? 그렇게함으로써 무엇을 얻을 것으로 기대합니까? – Stewart

0

당신의 질문은 완전히 명확하지는 않지만, 파일을 만들고, 5MB를 쓰고, 100MB로 탐색하고, 메타 데이터를 쓰고, 다시 5MB로 탐색하고, 5MB를 다시 쓰는 것 같습니다.

이 경우 파일 시스템 문제입니다. 파일을 확장하면 NTFS는 그 차이를 무언가로 채워야합니다. 말했듯이, 파일은 쓰기 전까지 할당되지 않습니다. 처음으로 메타 데이터를 쓰면 파일의 크기가 5MB 밖에되지 않으므로 메타 데이터를 쓰려면 NTFS가 메타 데이터를 쓰기 전에 95MB의 0을 할당하고 작성해야합니다. Upsettingly 나는 또한 동기식으로 이것을 수행하므로 중복 된 IO를 사용하여 이기지 못한다고 생각합니다.

+0

틀렸어. FS는 그 사이에 아무 것도 쓰지 않아도 돼. –

+0

정말이에요? NTFS는 확실히 스파 스 파일을 지원하지만 기본적으로는 사용하지 않으며 특수 OS를 사용하려면 특수한 OS 권한이 필요합니다. 이것은 95MB의 사용되지 않는 파일이 실제로 할당되고 제로화 될 필요가 있음을 암시합니다. – Stewart

관련 문제