0

我需要提高桌面应用程序 (.net) 的性能,该应用程序旨在读取数据库并基于 XBRL(可扩展业务报告语言)创建 xml 文件。它使用 UBMatrix 创建 XBRL 分类法。

如果特定数据的大小很小,则应用程序可以正常工作。但是如果数据很大,应用程序将需要 30 多分钟才能生成文件。客户数据总是很大/很大。所以应用程序需要更多的时间来生成文件。

我的任务是优化应用程序以减少创建 xml 文件所需的时间。当我检查应用程序时,我发现应用程序正在以这种方式运行。

开始

  • 创建到数据库的连接
  • 获取第一组数据(此表(table1)太大)。查询将返回大约 15-30 K 行到 dataTable
  • for 循环 0 到 datatable.Rows.count
    • 检查一些条件
    • 从数据库中获取数据。(这个表(table2)也比(table1)大。
    • 发送数据以形成 xbrl 并写入 xml(这是由名为 UBMatrix 的第三方应用程序完成的)。无法编辑创建 xbrl-xml 文件的代码。

同样有3到4组数据会处理

根据我的观察,我们可以避免在 for 循环中调用 db。获取循环前的所有数据。当我检查查询时,有子查询,不存在(从表中选择 *)等可以用连接替换,不存在(从表中选择 1)

但是应用程序仍然需要循环处理。我也在考虑使用线程,以便我可以根据数据的大小创建线程并同时处理它。

例如

  • 如果有 100 行。xml 文件 (XBRL) 将有 100 个条目
  • 所以我将制作 50,50 并在两个线程中运行,这将生成两个 xml 文件。最后,我会将两者合并为一个 xml 文件。

因此可以同时开始第 0 题和第 50 题的处理。目前在 for 循环中,第 0 次将处理,第 99 次将仅在最后处理。我不确定这个想法。任何人都可以建议/分享您的想法。任何帮助将不胜感激。提前致谢

4

4 回答 4

0

在没有看到代码的情况下,我无法判断您正在使用哪些类进行数据访问,但是从您提到的 DataTable.Rows 我假设您正在使用 DataSet/DataTable。如果您切换到将IDataReaderCommandBehavior.SequentialAccess一起使用,则可以避免 DataSet/DataTable 带来的许多不必要的开销。

于 2012-02-19T22:05:43.767 回答
0

我建议使用探查器,但适用于 .NET 应用程序。检查它大部分时间花在哪里并攻击那个地方。如果是从数据库获取数据的调用,您可以查看数据库并可能添加一些新索引和/或重新设计查询。如果是在调用 UBMatrix 中,除了向给你这个任务的人解释一下,你可能无能为力。但在你放弃之前,你可以尝试并行处理,首先确保 UBMatrix 是线程安全的,正如 Simon 指出的那样。如果不是,或者您不能告诉您可以将并行处理作为单独的 AppDomain 运行以模拟线程安全。不过,这将以资源和更复杂的代码为代价。

如果磁盘被大量使用,另一种方法可能是检查将 xml 文件写入 RAM 驱动器是否会有所改善。

无论如何,从分析您的 .NET 应用程序开始 - 这应该会给您一个很好的起点。这是一个免费的 .NET 分析器: http: //www.eqatec.com/tools/profiler/

于 2012-02-19T22:06:52.773 回答
0

30 分钟内 30k 次查询仅是每秒 16 次查询。除非查询很昂贵,否则这不是很多。

要找出答案,请运行 SQL Profiler 并检查每个查询的执行时间。乘以查询数。如果这合理地接近 30 分钟,那么如果您可以将所有这些查询重写为连接并将结果放入 aDictionary或中,那么您是幸运的ILookup

如果您需要使用多线程。检查您是否有可能升级到 .NET 4。然后您可以使用Parallel.ForEachTPL 中的或其他一些合适的方法来并行化您的工作。

于 2012-02-19T21:55:40.043 回答
0

不是真正的答案,只是一个非常大的评论:

我会从你的计划中删除多线程,除非 UBMatrix API 声明它是线程安全的,在生成 XBRL 时考虑所有磁盘 I/O。

您是否对应用程序的内存使用情况进行了分析?我正在考虑加载 15-30K 行数据,然后可能在处理和写入文件之前将其传输到对象模型中。如果您开始达到 2GB 限制(32 位),那么您的进程将执行大量分页,这太慢了。

这种替代方案是否可行?将数据预生成到文件中,可能是 xml 格式。然后,希望 UBMatrix 有一个接受文件路径和流数据的 api,您可以将路径传递给文件数据。(如果是内存问题,这更多,但如果数据查询长时间运行,仍然可以加快速度。)

于 2012-02-19T21:27:12.767 回答