2010-09-08 50 views
2

我有一個C#應用程序,並且正在使用FileStream類從千兆位局域網上的* EDIT * isilon存儲單元(映射到z驅動器)讀取120GB文件。我以45兆字節/秒的讀取速度開始,但在大約20GB的範圍內,我的讀取速度急劇下降,並達到約9兆字節/秒。有沒有人有任何想法可能會導致經濟放緩?複製巨大(120 + GB)文件時速度變慢

服務器是Windows Server 2008 Enterprise R2 64位,16 GB RAM,雙四核CPU,我的應用程序是64位.NET Framework 4.0控制檯應用程序。這裏是我的代碼:

 byte[] buffer = new byte[16777216]; 
     int count; 
     long totalBytes = 0; 
     FileStream file = File.OpenRead("z:\bigfile.dat"); 
     while ((count = file.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      // I track megabyte/second here 
      totalBytes += count; 
     } 
+0

看看是否相同代碼在單聲道上有一個放緩,這樣你就知道它是否是一個NTFS問題(我覺得它是這樣) – alternative 2010-09-08 00:14:02

+1

無論如何整理磁盤。 – 2010-09-08 00:26:33

+3

這只是一杯茶的操作系統。隨它去。 – slugster 2010-09-08 00:41:13

回答

1

原來我是實際上通過網絡閱讀。我認爲我的映射驅動器是本地的,但事實並非如此。在網絡上閱讀時我仍然遇到問題,但是現在當我真正從本地磁盤讀取文件時,速度就是我期望的。感謝大家。

編輯我修復了通過網絡讀取的問題。您可以創建一個不使用此代碼使用Windows緩存一個FileStream:

FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, bufferSize, (FileOptions)0x20000000); 

的0x20000000是沒有在.NET框架枚舉又一個標誌,但它基本上是說,不使用緩存。

http://msdn.microsoft.com/en-us/library/cc644950%28v=VS.85%29.aspx

0

那麼這取決於你如何管理流。你讀,寫入新文件,清理緩衝區?因爲RAM顯然不能存儲120GB。

你應該給我其餘的代碼,從我看到的那裏,沒有辦法幫助你。

+0

這真的是所有的,我不寫任何數據,我只是讀它,存儲讀取的總字節數,然後將字節扔到垃圾回收器... – jjxtra 2010-09-08 02:23:44

1

我不知道循環本身是否阻止GC收集循環中生成的垃圾。有a Microsoft KB article描述單線程控制檯應用程序的情況。正如文章中所建議的那樣,我建議在主要方法中加入[MTAThread]。

0

最有意思的是知道CopyFile是否做同樣的事情。沒有看到其他代碼,很難說。一個不常見的事情發生在人們身上,就是他們用髒數據填充系統緩存,所以它尖叫了一段時間(只是做了一堆緩存的I/O),然後在寫入開始時顯着減速。這是當你發現你的複製實施速度有多快......當它的大小在機器的RAM大小的軌跡上時,它開始向南的事實是一個非常有趣的提示...

0

你會得到更快的吞吐量在網絡上都使用異步 處理在本地計算機上...

看那的BeginRead方法...