与C#中的USB相比,从Mapped网络驱动器读取文件非常慢

时间:2014-06-13 06:47:05

标签: c# windows-services crc32

我将文件从USB和网络映射共享驱动器复制到我的服务器。在复制文件之前,我正在进行某些验证,一旦验证完成,我就会将文件复制到目的地。使用System.Interop.Services进行重要验证是 CRC 验证。所有这些都是由用C#编写的Windows服务完成的。

问题:我的USB和映射网络驱动器模块都经过相同的代码,即执行CRC验证和复制的代码。

如果我使用800MB文件启动我的进程,则从USB进行验证,然后CRC验证最多需要30秒,最多可以复制1分钟。

从网络映射驱动器,如果我使用800MB文件启动我的进程,则CRC验证大约需要10分钟,最多可以复制1分钟。

  1. 为什么会有这种差异?
  2. 为什么USB上的相同操作比网络映射驱动器快得多?
  3. 仅仅是因为以太网速度?或其他技术上的东西?
  4. 如果速度快,那么我复制文件只需要1分钟的USB和Mapped Network Drive。只有在执行CRC(同样是USB和NT映射驱动器的相同代码和逻辑)时,我才能观察到这种差异。

    添加信息:我使用.Net Framework,C#,wNetAddConnection来映射网络驱动器。

    请求您的专家意见。

    CRC验证代码:

    internal class CRC 
    { 
    
    [System.Runtime.InteropServices.DllImport( "CRC.dll" )] 
    public static extern int Validate665Loadset( string pszLoadsetPath );
    
    } 
    

    这就是我正在呼叫它并返回该值。如果它是ZERO则内容有效,否则不是。这就是逻辑。

1 个答案:

答案 0 :(得分:1)

您是如何访问该文件的?是的,完全有可能只是非常不同的带宽,但CRC验证的时间是复制的相同来源(网络)的10倍,表明代码正在进行时髦的东西 - 因为基本上都涉及读取所有字节,它们应该大致相同(警告:操作系统可以在某些情况下优化复制方案 - 例如在多个网卡上复制单个文件)同一时间 - 如果将文件用作流,则无法实现。我怀疑首先要看的是缓冲区大小;或者可能添加一个明确的BufferedStream