2010-09-08 24 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方法...