复制巨大(120 + GB)文件时减速

时间:2010-09-08 00:05:39

标签: c# windows file-io

我有一个C#应用程序,并且使用FileStream类从千兆LAN上的* EDIT * isilon存储单元(映射到z驱动器)读取120GB文件。我首先获得45兆字节/秒的读取速度,但是在大约20GB的范围内,我的读取速度急剧下降并且稳定在大约9兆字节/秒。有没有人对可能导致经济放缓的原因有任何想法?

服务器是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;
        }

5 个答案:

答案 0 :(得分:1)

我想知道循环本身是否阻止GC收集循环中生成的垃圾。有a Microsoft KB article描述了单线程控制台应用程序的情况。我建议将[MTAThread]添加到main方法中,如文章中所述。

答案 1 :(得分: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

答案 2 :(得分:0)

这取决于你如何管理流。你读,写到新文件,清理缓冲区?因为RAM显然不能存储120GB。

你应该提供剩下的代码,从我在那里看到的,没有办法帮助你。

答案 3 :(得分:0)

最有趣的是知道CopyFile是否做同样的事情。没有看到其余的代码,很难说。人们遇到的一个非常罕见的事情是,他们用脏数据填充系统缓存,因此它会尖叫一段时间(只是做一堆缓存的I / O)然后当写入开始时它会显着减慢。那时候你会发现你的拷贝实现速度有多快......当它的大小处于机器RAM大小的大小时它开始向南的事实是一个非常有趣的暗示......

答案 4 :(得分:0)

使用异步,您可以在网络和本地计算机上获得更快的吞吐量 处理...

查看BeginRead方法......