Foxtable(狐表)用户栏目专家坐堂 → System.OutOfMemoryException


  共有1971人关注过本帖树形打印复制链接

主题:System.OutOfMemoryException

帅哥哟,离线,有人找我吗?
creastzh
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
System.OutOfMemoryException  发帖心情 Post By:2024/7/24 5:46:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:question.txt

图片点击可在新窗口打开查看
[此贴子已经被作者于2024/7/24 5:48:14编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
creastzh
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2024/7/24 5:53:00 [只看该作者]

老师, 我想了解的问题发不了,直接提示上图的错误, 所以我将内容拷贝到了附件中,请帮我看一下解决方法, 谢谢!
此外,论坛上看到类似发帖使用Sql From语句无法上传,我试着进行 将Sql 语句中的 From改成 F ROM, FR OM 好像也不行, 不知是何原因, 谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
2900819580
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1353 积分:9868 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2024/7/24 8:17:00 [只看该作者]

Select 也要更改为 S elect

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111412 积分:567130 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/7/24 9:17:00 [只看该作者]

如果出现了内存溢出,还继续执行代码,各种数据很大可能都是不正确的,因为内存不足,部分数据会被抛弃。

建议
1、如果没有控制初始加载量(http://www.foxtable.com/webhelp/topics/1268.htm),那么DataTables.Load("INISecondarySchedule")这种用法在加载表格的同时会加载表格所有数据,建议控制一下初始不加载任何数据

2、不要重复的加载卸载表格,这本身也是很耗资源的。已经加载的保管完全没有必要卸载,加条件加载空表即可。或者干脆完全使用SQLcommand加载表格数据,不要使用datatables。

3、如果一次处理的数据还是比较多,建议再分页,比如4个月的数据,按月每次只处理一个月,分4次执行

4、如果类似的这种计划任务比较多,并且都是要处理很多数据的。考虑分为多个项目(程序)使用,一个项目(程序)处理一个任务。这样每个项目(程序)都有独立的运行内存空间,不会互相影响

 回到顶部
帅哥哟,离线,有人找我吗?
creastzh
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2024/7/24 21:57:00 [只看该作者]

项目启动时,我设置了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,和改用 加条件加载空表试试看. 谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
creastzh
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2024/7/24 22:05:00 [只看该作者]

刚才我使用循环指令测试了一下, 如果没有加载所有表,仅加载基础的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 

 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111412 积分:567130 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/7/25 9:01:00 [只看该作者]

【如果没有加载所有表,仅加载基础的4个表,在任务管理器中任务占用内存170M左右, 在加载完全部107个表(全部为空表)后内存占用250.4M】这个是正常的。

然后如果有10个表,每个表加载5W行数据,那么内存占用【超过450M,甚至到了540M左右】也是正常的。如果可能会由多个任务同时在执行,每个任务处理几个表,每个表加载几万数据,叠加起来内存就上去了。

另外还有任务里定义的变量,比如字典,集合等,也是要耗内存的。如果还有备注列,图片处理等,内存使用更加厉害了

还有关联表、窗口等都要占用内存的。

 回到顶部