我正在研究需要高文件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);
每隔幾秒鐘我寫〜5MB。
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 2010-05-16 19:34:40
你的意思是你預先分配了100MB,然後_then_ start從0開始寫入5MB塊?所以最多有20塊? – 2010-05-16 19:37:45
嗨亨克, 一般來說,代碼如下(我仍然試圖瞭解如何格式化代碼)。: 首先打開文件: m_Stream =新的FileStream(文件名,FileMode.CreateNew,FileAccess.Write,FileShare.Write,8192,假); 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(); ==>首次寫入時間過長; – 2010-05-16 20:14:31