【问题标题】:Would reading/writing a file take the same time as moving the file?读取/写入文件会与移动文件花费相同的时间吗?
【发布时间】:2016-05-04 14:00:13
【问题描述】:

我需要对文本文件进行修改并保持原始文件不变。现在我正在使用读取器/写入器并读取文件,然后在没有修改的情况下将其写回。

不幸的是,文本文件很大,大约 2gb,大约需要一个小时才能完成(因为文本文件位于网络驱动器上)。

使用 file.Move 会比读/写更快吗?例如,将文本文件移动到本地机器,进行修改,然后将其移回?

或者,复制原件并以这种方式进行修改和修改,而不必读/写?

我当前的代码:

try
{
    using (StreamReader reader = new StreamReader(filePath))
    {
        using (StreamWriter writer = new StreamWriter(output)) 
        { 
            //go through the whole txt file
            while (!reader.EndOfStream)
            {
                //gets the line
                line = reader.ReadLine();
                if (!modification case goes here))
                {
                    writer.Write(line);
                }
            }
        }
    }
  }
}

任何帮助将不胜感激!

【问题讨论】:

  • 您是否尝试将文件复制到本地计算机然后再复制回来?这将为您提供一个基准时间,即在本地修改文件将花费时间。如果来回复制接近 1 小时,那么您不太可能从本地修改中获得很多好处。
  • 性能影响在哪里?如果它不在线 = reader.ReadLine();那么文件的位置无关紧要,我猜瓶颈将是您的修改检查。如果读取线();是您的瓶颈吗?我认为在本地移动文件然后再返回会有所帮助。
  • 感谢您的建议!我会立即测试并报告。
  • 多个客户端是否可以通过网络访问该文件?如果是,则需要某种锁定解决方案来确保您可以安全地修改文件。此外,显而易见的几点:1)如果可能的话,将文件分成更小的块。 2) 切换到 1GbE 设备(不再昂贵),3) 直接在联网机器上安装应用程序/服务,4) 切换到 SMB/iSCSI,这将允许您使用内存映射处理文件。

标签: c# file text


【解决方案1】:

使用连接的网络驱动器,在本地复制文件总是更快,做任何事情并将其复制回来。通过这种方式,您可以使用在磁盘驱动器的硬件级别实现的缓存和提前获取(预缓存)。网络吞吐量始终限于以每秒兆字节数表示的 Network_T_Rate / 10 的平均公式。因此,例如,如果您有 100T,与大多数公司网络一样,无论读取还是写入,您都将获得 ~10Mb/s,因为另一端的磁盘比网络快。换句话说,你的瓶颈是网络。

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2016-07-25
    • 2016-03-31
    • 2017-08-27
    相关资源
    最近更新 更多