如果这个问题有点模糊,我道歉。
我正在编写一个C#应用程序,它对SQL Server数据库进行数据操作。对于一组项目,我读取每个项目的数据,对数据进行计算,然后将结果写入数据库。
我遇到的问题是,当要处理的项目数量增加时,应用程序开始相对于处理每个项目所花费的时间开始变慢。
我正在尝试非常小心地为已分配的对象释放内存,因为我正在使用它们。当我开始处理下一个项目时,我希望在处理一个项目时没有任何问题。我使用数据表的“使用”结构和BulkCopy类来尝试强制清理内存。
然而,在一次调用程序时,我尝试处理的项目越多,每个项目的运行时间几何增加。
我的程序是一个WinForms应用程序。我似乎并没有因为我正在做的事而吞噬服务器的内存。我正在尝试处理与处理所有其他项目相关的每个项目,以确保在每次调用应用程序时处理的项目数无关紧要。
有没有人在他们的应用程序中看到过这种行为,并知道要寻找什么来纠正这个问题?
答案 0 :(得分:0)
您可以注意的一些事项 - 如果您使用“使用”语句 - 您是否确保在操作对象时不保持连接打开?最好确保从数据库中获取数据,关闭连接,进行操作然后再发送数据。
您是否使用存储过程来获取/发送复杂对象?您还可以尝试在存储过程内部或从它们调用的函数中执行某些数据操作 - 您不希望将整个业务类卸载到数据库,但是您可以在那里执行一些操作,具体取决于您的操作正在做。
确保您的数据结构也得到优化(主键索引,外键,触发器等等。您可以从http://www.brentozar.com/first-aid/获取一些脚本来检查数据库的优化。
如上所述,尝试使用一些并行/异步模式来分配你的工作 - await / async对此非常有帮助,特别是如果你想要计算同时将以前的数据发送回服务器。
答案 1 :(得分:0)
感谢所有输入。我检查了打开/关闭连接等问题,看看我是否整洁。真正有用的是删除目标数据表上的主键。这些是相对于最终用户需要的设置而设置的,但它们确实使数据插入的速度变得很快。让人们考虑更新数据与使用数据的数据库约束。
此外,在使用内存DataTable中的过滤器进行选择时发现了性能问题。不知怎的,我正在做的事情陷入了大量的行(30,000)。我意识到我错误处理了数据,并没有真正需要这样做。但它确实向我展示了在试图拖动这么多数据时微量测试逻辑的每一步的必要性。