【问题标题】:How to increase the writing speed of the streamwriter?如何提高streamwriter的写入速度?
【发布时间】:2011-10-20 14:38:25
【问题描述】:

如何提高 streamwriter 写入 83MB csv 文件的速度。 我已经将缓冲区大小增加到 65536,但它也消耗了更多时间。如何提高速度。


StreamWriter writer =new streamWriter(
      new FileStream(filePath, FileMode.CreateNew), Encoding.UTF8, 65536))
string str=string.Empty;
while((str = reader.ReadLine())!=null)
    writer.WriteLine(str)}        
writer.Close()

【问题讨论】:

  • 你能把你现在用来写的代码贴出来吗?
  • 它需要多长时间,您有多确定它是 StreamWriter 而不仅仅是计算您正在编写的数据所花费的时间?
  • 试试复制/粘贴 512 MB 的 csv 文件需要多长时间。这是您可以做到的最快速度。
  • 例如。 83mb 文件需要 34 分 27 秒,缓冲区大小为 65536。如果我没有给出缓冲区大小,则需要 35 分 50 秒
  • StreamWriter writer =new streamWriter(new FileStream(filePath, FileMode.CreateNew), Encoding.UTF8, 65536))string str=string.Empty;While((str = reader.ReadLine())!=null)writer.WriteLine(str)}writer.close()

标签: c# winforms web-applications


【解决方案1】:

我会尝试进一步提高缓冲区。在那个缓冲区大小下,创建整个文件将需要超过 8200 次写入。尝试使用 256K 或 512K 左右的缓冲区。

【讨论】:

  • streamwriter 缓冲区的最大大小是多少?如果我将 Buffersize 增加到最大意味着它会降低性能吗?
【解决方案2】:

根据您的评论显示您的代码实际在做什么:

File.WriteAllText( filePath, reader.ReadToEnd() );

【讨论】:

  • 我必须读取一个 83Mb 的文件并逐行写入另一个相同大小的文件。所以我正在使用streamwriter来做到这一点。但是如果文件的大小增加,它会消耗更多的时间。
【解决方案3】:

根据您的 CSV 文件包含的行数,您最终可能会遇到一个执行数百万次的循环。多次访问磁盘不是一个好主意。

简单的方法(如果你有内存)是读取内存中字符串 [] 中的整个 CSV 文件(我认为使用 File.ReadAll()),进行处理并全部写入一次(File.WriteAll () 我想)。 这将大大提高您的表现。

另一种方法是使用异步读/写,增加缓冲区大小并创建一种机制来读取更大的数据块。如果您只阅读 1 行,那么拥有一个大缓冲区将无济于事。

【讨论】:

  • ya.. 但如果我需要通过一些字符串操作来操作文件的每一行。那我该怎么做。以及缓冲区的最大大小是多少。如果我将大小设置为最大值,那么会发生什么?这会导致性能下降吗?
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2019-03-06
  • 2021-11-15
  • 2023-03-03
  • 1970-01-01
  • 2016-08-14
相关资源
最近更新 更多