나는 높은 파일 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).
코드를 알려주십시오. – SLaks
100MB를 미리 할당하고 _then_ 위치에서 시작하여 5MB 덩어리를 쓰는 것을 의미합니까? 그래서 최대 20 개의 청크가 있습니까? –
안녕 헨크, 일반적으로 코드는 다음과 같습니다 (나는 여전히 코드를 포맷하는 방법을 이해하려고합니다).: 먼저 파일을 엽니 다. 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(); 처음 쓰기에 너무 오래; –