代码之家  ›  专栏  ›  技术社区  ›  jjxtra

复制大型(120+GB)文件时速度减慢

  •  2
  • jjxtra  · 技术社区  · 14 年前

    我有一个C应用程序,正在使用filestream类通过gigabit 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 回复  |  直到 14 年前
        1
  •  1
  •   tia    14 年前

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

        2
  •  1
  •   jjxtra    14 年前

    结果发现我其实是在通过网络阅读。我以为我的地图驱动器是本地的,但不是。我在通过网络读取文件时仍然有问题,但是当我现在实际从本地磁盘读取文件时,速度是我所期望的。谢谢大家。

    编辑 我通过网络阅读解决了这个问题。可以创建不使用Windows缓存的文件流,代码如下:

    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

        3
  •  0
  •   user441940    14 年前

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

    你应该把剩下的代码,从我现在看到的来看,没有办法帮助你。

        4
  •  0
  •   jrtipton    14 年前

    最有趣的是知道copyfile是否做了同样的事情。如果没有看到其余的代码,就很难说了。人们发生的一件并不罕见的事情是,他们用脏数据填充系统缓存,所以它会尖叫一段时间(只是做一堆缓存的I/O),然后当写操作开始出现时,速度会明显减慢。这时,您将发现您的复制实现有多快…事实上,它开始向南走,当大小是在球场上的机器的内存大小是一个相当有趣的提示…

        5
  •  0
  •   stevenrcfox    14 年前

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

    看看beginread方法…