2010-05-16 221 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); 

每隔幾秒鐘我寫〜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). 
+0

請向我們顯示您的代碼。 – SLaks 2010-05-16 19:34:40

+0

你的意思是你預先分配了100MB,然後_then_ start從0開始寫入5MB塊?所以最多有20塊? – 2010-05-16 19:37:45

+0

嗨亨克, 一般來說,代碼如下(我仍然試圖瞭解如何格式化代碼)。: 首先打開文件: 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

回答

2

如上文建議將它沒有任何意義(假設你必須在文件末尾的元數據)寫的第一。

這會做2件事(假設非稀疏文件)... 1.爲整個文件分配總空間 2.隨着空間準備好並等待,使以下任何寫入操作稍快一點。

你能不能做到這一點asyncronously? 至少應用程序可以轉向其他事情。

0

您是否試過AppendAllText方法?

+0

非常感謝您的快速回復。 我怕得到這些答案:-) 移動元數據比文件末尾以外的任何其他地方是有問題的,但我的樣子,我沒有任何其他選擇。 非常感謝 – 2010-05-16 20:06:44

+0

你爲什麼叫Flush()?你期望通過這樣做獲得什麼? – Stewart 2010-05-16 22:20:37

0

你的問題是不完全清楚,但我的猜測是,你創建一個文件,寫入5MB,然後尋求100MB,寫的元數據,然後尋求回5MB,並另寫5MB等。

如果是這樣的話,這是一個文件系統的問題。當你擴展文件時,NTFS必須填補一些空缺。正如你所說,文件在你寫入之前不會被分配。第一次寫元數據時,文件只有5MB長,所以當你編寫元數據時,NTFS必須在寫元數據之前分配並寫出95MB的零。令人不安的是,我認爲它也是同步的,所以你甚至不會使用重疊的IO。

+0

錯誤的是,FS不必'寫'任何東西。 – 2010-05-16 20:28:24

+0

你確定嗎? NTFS絕對支持稀疏文件,但默認情況下它不會使用它們,您需要特殊的操作系統權限才能啓用它們。這表明95MB未使用的文件實際上需要分配和歸零。 – Stewart 2010-05-16 21:56:45