2013-07-03 25 views
3

在我的應用程序中,我需要在大文件(大約2-7 GB)內每隔大約50ms連續寫入數據塊(大約2MB)。這是以順序循環的方式完成的,所以我把chunk寫入文件之後,當我在文件結尾處時,我從頭開始重新開始。在HDD上高效連續數據寫入

目前我做如下:

在C#我打電話File.OpenWrite一次打開具有讀取權限的文件,並與SetLength設置文件的大小。當我需要寫一個塊時,我將安全文件句柄傳遞給非託管的WriteFile(kernel32.dll)。因此,我傳遞了一個重疊結構來指定塊必須被寫入的文件內的位置。我需要寫的塊存儲在非託管內存中,所以我有一個IntPtr,我可以將它傳遞給WriteFile

現在我想知道是否以及如何讓這個過程更有效率。有任何想法嗎?

詳細一些問題:

  • 將文件I/O更改爲內存映射文件的幫助?
  • 我可以爲NTFS包含一些優化嗎?
  • 創建我缺少的文件時是否有一些有用的參數? (可能是具有特殊參數的非管理呼叫)
+0

是否有一個要求指定每n毫秒寫入數據?您可以緩衝數據並每n秒寫入一次。與非緩衝型(50ms - 12ms = 38ms,52MB/s)相比,這樣可以縮短訪問時間(1000ms - 12ms =剩餘時間約爲998ms,以約40MB/s寫入)。 – Caramiriel

+0

據我所知,文件寫入已被系統緩存。然而,與我目前的實施相比,檢查一下像您所建議的更大的緩衝區如何執行可能會很有趣。這尤其是因爲我無法控制I/O緩存的大小以及如何處理緩存。 –

回答

2

使用更好的硬件可能是提高文件寫入效率最具成本效益的方式。 有一篇來自微軟研究的文章,將回答你的大部分問題:Sequential File Programming Patterns and Performance with .NETdownloadable source code (C#)如果你想從你的機器上的紙上運行測試。

簡而言之:

  • 默認行爲提供了一個單一的磁盤上的出色表現。
  • 如果您有磁盤陣列,則應測試未被配置的IO。可以提高八倍的寫入速度。

此線程在social.msdn也可能是有趣的。