[此贴子已经被作者于2024/7/24 5:48:14编辑过]
老师, 我想了解的问题发不了,直接提示上图的错误, 所以我将内容拷贝到了附件中,请帮我看一下解决方法, 谢谢!
此外,论坛上看到类似发帖使用Sql From语句无法上传,我试着进行 将Sql 语句中的 From改成 F ROM, FR OM 好像也不行, 不知是何原因, 谢谢!
如果出现了内存溢出,还继续执行代码,各种数据很大可能都是不正确的,因为内存不足,部分数据会被抛弃。
建议
2、不要重复的加载卸载表格,这本身也是很耗资源的。已经加载的保管完全没有必要卸载,加条件加载空表即可。或者干脆完全使用SQLcommand加载表格数据,不要使用datatables。
3、如果一次处理的数据还是比较多,建议再分页,比如4个月的数据,按月每次只处理一个月,分4次执行
4、如果类似的这种计划任务比较多,并且都是要处理很多数据的。考虑分为多个项目(程序)使用,一个项目(程序)处理一个任务。这样每个项目(程序)都有独立的运行内存空间,不会互相影响
项目启动时,我设置了BeforeLoadOuterTable 事件:'按条件加载工作表
Select Case e.DataTableName
Case "Data", "Start", "ResourceID"
'加载所有数据
Case "EMList"
e.SelectString = "S elect * F rom {" & e.DataTableName & "} Where [在册]='Y'"
Case Else
e.Cancel = True
e.SelectString = "S elect * F rom {" & e.DataTableName & "} Where [_identify] is null"
End Select
因此当前加载就是空表.
此前我也曾向论坛询问过, 当前我编写的的表单数量已经超过100个了, 论坛上的老师也建议我不用卸载表,但如果在任务自动化过程中这么多表都打开我查看到任务管理器中资源占用超过450M,甚至到了540M左右,经常导致系统因内存不足而终止, 自从修改程序为每次运行结束就卸载表的方式后, 任务占用内存基本在220M左右, 差错也少了很多, 但我不知道会出现这次这样的问题, 既然这样的话,那我这次再按您说的方法尝试一下SqlCommand,和改用 加条件加载空表试试看. 谢谢!
刚才我使用循环指令测试了一下, 如果没有加载所有表,仅加载基础的4个表,在任务管理器中任务占用内存170M左右, 在加载完全部107个表(全部为空表)后内存占用250.4M, 我不知道这种状态是否正常.
Dim dr1a As List(Of String) = DataTables("Data").SQLGetValues("数据库_表名", "数据库_表名 is not Null")
For Each tn As String In dr1a
Output.Show(tn)
If Not DataTables.Contains(tn) Then
DataTables.Load(tn)
End If
Next
【如果没有加载所有表,仅加载基础的4个表,在任务管理器中任务占用内存170M左右, 在加载完全部107个表(全部为空表)后内存占用250.4M】这个是正常的。
然后如果有10个表,每个表加载5W行数据,那么内存占用【超过450M,甚至到了540M左右】也是正常的。如果可能会由多个任务同时在执行,每个任务处理几个表,每个表加载几万数据,叠加起来内存就上去了。
另外还有任务里定义的变量,比如字典,集合等,也是要耗内存的。如果还有备注列,图片处理等,内存使用更加厉害了
还有关联表、窗口等都要占用内存的。