![](/img/trans.png)
[英]SqlDependency issues, Visual C++ .Net 3.5, SQL Server 2008
[英]Performance Optimization for .net 3.5 desktop Application and SQL Server 2008
我需要提高桌面应用程序(.net)的性能,该应用程序旨在读取数据库并基于XBRL(可扩展业务报告语言)创建xml文件。 它使用UBMatrix创建XBRL分类法。
如果特定数据的大小很小,则该应用程序可以正常运行。 但是,如果数据很大,则应用程序将花费30分钟以上的时间来生成文件。 客户数据总是很大/很大。 因此,应用程序需要更多时间来生成文件。
我的任务是优化应用程序,以减少创建xml文件所需的时间。 当我检查应用程序时,我发现该应用程序正在以这种方式运行。
开始
同样,将处理3到4组数据
在我看来,我们可以避免在for循环中进行db调用。 在循环之前获取所有数据。 当我检查查询时,有子查询,不存在(从表中选择*)等可以替换为联接,不存在(从表中选择1)
但是仍然需要应用程序进行循环处理。 我也在考虑使用线程,以便我可以根据数据大小创建线程并同时处理它。
例如
因此,第0个问题和第50个问题的处理可以同时开始。 当前在for循环中,第0个将处理,第99个将仅在最后处理。 我不确定这个主意。 可以提出任何建议/分享您的想法。 任何帮助将不胜感激。 提前致谢
并不是真正的答案,只是一个非常大的评论:
我会从您的计划中删除多线程,除非UBMatrix API声明它是线程安全的,并在生成XBRL时考虑所有光盘I / O。
您是否已针对您的应用配置了内存使用情况? 我正在考虑要加载15-30K的数据行,然后在处理和写入文件之前将其转移到对象模型中。 如果您开始达到2GB的限制(32位),那么您的进程将进行大量分页,这太慢了。
这种选择是否可能? 将数据预生成为文件,可能是xml格式。 然后,希望UBMatrix有一个可以接受文件路径并传输数据的api,您可以将路径传递给文件数据。 (这更多地是为了解决内存问题,但是如果数据查询长时间运行,它仍然可以加快速度。)
30分钟内进行3万次查询仅每秒16次查询。 除非查询很昂贵,否则这不是很多。
要找出答案,请运行SQL Profiler并检查每个查询的执行时间。 乘以查询数量。 如果在30分钟左右可以比较合理,那么您很幸运,可以将所有这些查询重写为ILookup
并将结果放入Dictionary
或ILookup
。
如果您需要诉诸多线程。 检查是否可以升级到.NET4。然后可以使用Parallel.ForEach
或TPL中的其他合适方法来并行化工作。
没有看到代码,我无法告诉您正在使用哪些类进行数据访问,但是从您提到的DataTable.Rows开始,我假设您正在使用DataSet / DataTable。 如果将IDataReader与CommandBehavior.SequentialAccess一起使用,则可以避免DataSet / DataTable附带的许多不必要的开销。
我建议使用Profiler,但适用于.NET应用。 检查大部分时间都花在哪里,然后攻击那个地方。 如果是从数据库获取数据的调用,则可以查看数据库并添加一些新索引和/或重新设计查询。 如果它是在UBMatrix的调用中,则除了向向您提供此任务的人员提供解释外,您可能无能为力。 但是在放弃之前,您可以尝试并行处理,如Simon所指出的,首先要确保UBMatrix是线程安全的。 如果不是,或者您不能告诉您可以将并行处理作为单独的AppDomain运行,以模仿线程安全性。 但是,这将以资源和更复杂的代码为代价。 并行处理仅在正常运行应用程序时可以观察到CPU使用率低于70%且磁盘未过度使用(请与Resource Monitor一起检查),因此有可用的备用资源才有意义。
如果大量使用磁盘,另一种方法可能是检查将xml文件写入RAM驱动器是否可以改善任何情况。
无论如何,从配置.NET应用程序开始-应该为您提供一个良好的起点。 这是一个免费的.NET探查器: http : //www.eqatec.com/tools/profiler/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.