orderList 为数据库里三个月的订单数据,excel导入再转成datatable,根据datatable的快递号,再去orderList 里比对,快递号存在的话,取出店铺名,在赋值到datatable里的owner字段,发现运行好慢,七千多条数据要五分多钟,给个优化的意见呗
3条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-02-29 08:26关注
liujunjieonline 上午好☀️☀️☀️️
本答案参考通义千问您提到的问题是关于遍历大数据量的DataTable并在其中查找匹配项时性能不佳。针对这个问题,以下是一些优化建议:
-
数据预处理和缓存:
- 对
orderList
进行排序或创建索引,以便快速查找快递号。 - 如果可能,将频繁查询结果缓存起来,避免重复查询数据库。
- 对
-
使用LINQ查询优化:
- 使用
Intersect
或Except
方法来找到快递号在dt
中但不在orderList
中的行,而不是每次单独查询。
- 使用
var existingTrackNums = dt.AsEnumerable() .Select(row => row.Field<string>("Express or Ground Tracking ID")) .ToList(); var unmatchedOrders = orderList.Where(order => !existingTrackNums.Contains(order.TrackNo));
- 减少IO操作:
- 在写入新的Excel文件之前,确保所有需要的
Owner
值已经计算出来。 - 将多个写入操作合并到一个文件操作中,减少文件系统I/O次数。
- 在写入新的Excel文件之前,确保所有需要的
string[] owners = new List<string>(); foreach (DataRow row in dt.Rows) { // ... 找到owner后,添加到owners列表 } // 在这里一次性写入所有owner到新的Excel文件 using (FileStream fileStream = File.OpenWrite(directoryPath + "MatchOwnByTrackNum.xls")) { // ... 将owners转换为byte[],然后写入 }
-
异步处理:
- 如果操作允许,可以考虑使用异步编程模型(如
Task
或async/await
)来提高并发处理能力。
- 如果操作允许,可以考虑使用异步编程模型(如
-
内存管理:
- 避免在循环中创建大量临时字符串,例如使用
StringBuilder
替换string.Concat()
。
- 避免在循环中创建大量临时字符串,例如使用
-
数据库连接池:
- 如果使用的是数据库驱动,确保数据库连接池有效利用,避免频繁打开和关闭连接。
通过以上优化,应该能显著提升代码的执行速度。不过,具体的优化效果取决于数据集大小、硬件配置以及数据库查询性能等因素。如果性能问题依然严重,可能需要进一步分析SQL查询性能或者考虑使用更高效的数据结构。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用 -
悬赏问题
- ¥15 SQLServer怎么录入下标
- ¥100 无网格伽辽金方法研究裂纹扩展的程序
- ¥15 如何用数码管显示学号(相关搜索:单片机)
- ¥15 错误于library(org.Hs.eg.db): 不存在叫‘org.Hs.eg.db’这个名称的程序包,如何解决?
- ¥60 求一个图片处理程序,要求将图像大小跟现实生活中的大小按比例联系起来的
- ¥50 求一位精通京东相关开发的专家
- ¥100 求懂行的大ge给小di解答下!
- ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
- ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
- ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'