【问题标题】:optimize large csv file writer - large table datareader using TPL PLINQ优化大型 csv 文件写入器 - 使用 TPL PLINQ 的大型表数据读取器
【发布时间】:2011-06-01 13:35:22
【问题描述】:

关于如何使用 TPL 和/或 PLINQ 进一步优化的任何提示。

以下代码在后台工作人员上运行

Read a large table using sql reader 
Open stream writer to write a large csv file
while (reader.read())
{
   massage the data, parse data from columns etc. 
   create csv string to write to file
   write csv line to file
}
close reader
close file

谢谢。

【问题讨论】:

  • 您能否将整个数据集吸入您的应用程序(或至少大部分数据集?)这将允许您同时在多条记录上并行运行massage the data, parse data from columns etc. 步骤。否则,您就是一种 SOL,因为我认为写入需要按特定顺序进行。
  • 不,太大而无法加载整个数据集。谢谢

标签: c# sql csv task-parallel-library plinq


【解决方案1】:

通过将 csv 行数据写入 StringBuilder(即,在内存中),然后将内容写入 csv 文件,您可能会发现更好的性能。我建议将这两种方法与 ANTS 或 JetBrains 产品等内存分析器一起使用。

【讨论】:

  • 流写入器是否采用字符串构建器?正如你提到的,我将对此进行调查并进行简介。谢谢
  • 这是请求内存不足异常。他可以改为增加他的 FileStream 的缓冲区大小,以使其更清洁和更可控。但老实说,我非常怀疑 CSV 写入对这里的性能有任何影响。
【解决方案2】:

定义“进一步优化”...您想要更快的速度还是更少的内存使用?

假设上面的伪代码被正确实现,那么内存使用应该已经非常少了。

速度?根据您正在处理大型数据集的说法,那么数据读取器将是您运行缓慢的最大原因。所以如果你真的想使用并行处理,那么你就不得不对你的数据集进行分片(大概是打开多个阅读器吧?)

但话又说回来,你已经在后台工作程序中运行它,那么这真的很重要吗?

【讨论】:

  • 我喜欢多个阅读器的想法,其中一个阅读器自上而下阅读,其他阅读器自下而上阅读(在两个阅读器上使用 asc desc 技巧的顺序..)这样我就可以在中间的某个地方见面并把这个任务分开。我会检查我的逻辑,看看这是否可能。谢谢
猜你喜欢
  • 2019-01-15
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2019-11-17
相关资源
最近更新 更多