【问题标题】:Generating PDF for 90K records为 90K 记录生成 PDF
【发布时间】:2016-03-04 18:13:22
【问题描述】:

目前我正在使用 LocalReport。渲染为 90K 记录创建 PDF。使用普通的“for”循环,仅创建 PDF 大约需要 4 小时。我尝试了很多选择。

  1. 尝试并行。 Foreach 设置和不设置 MaxDegreeOfParallelism 具有不同的值。我的系统中有 2 个处理器。设置 MaxDegreeOfParallelism(MDP) =4,它会像正常的“for”循环一样花费时间。我认为将 MDP 增加到 40 会加快这个过程。但是因为耗时 900 分钟,所以没有得到预期的结果。

  2. 二手

    var list=List<Thread ()>;
    foreach (var record in records) {
        var thread = new Thread (=> GeneratePDF());
        thread.Start();
        list.Add(thread);
    }
    foreach(var listThreads in thread){
        listThreads. Join();
    

    }

我就这样使用了上面的代码。但它最终创建了太多线程并花费了更长的时间。

我在使用 Parallel 方面需要帮助。 Foreach 可加快为 90K 记录创建 PDF 的过程。更改代码的建议也是可以接受的。 任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 运行多于内核的线程通常没有多大意义。上下文切换最终只会让它变慢。
  • @Matti 感谢您的回复。我需要改变什么来加快这个过程?
  • 你需要一台功能强大的机器才能真正让它更快。
  • @userrandomnumbers:你确定这代是 CPU 绑定的吗?你用过分析器吗?如果大部分时间都花在等待数据库或硬盘响应上,那么使用多线程将无济于事。
  • @Sriram 我目前正在使用 2 个处理器和 4 GB RAM。如果我增加处理器,使用 for 循环或使用 Parallel.ForEach 的过程会花费更少的时间吗?

标签: c# multithreading task-parallel-library multitasking parallel.foreach


【解决方案1】:

我不知道任何 pdf 生成器,所以我只能假设在初始化和完成任务时会有很多开销。这就是我要做的:

找到一个开源的 pdf 生成器。

让它生成几个单独的 pdf 文件 - 页眉、页脚等。

挖掘代码以查找页眉/页脚的完成位置,并尝试绕过它们以重用生成器状态,而无需运行整个过程。

尝试将存储状态的 pdf 和只编写不同部分的生成器拼接在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2012-08-15
    相关资源
    最近更新 更多