Foxtable(狐表)用户栏目专家坐堂 → [求助]代码运行过程释放内存


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

主题:[求助]代码运行过程释放内存

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
[求助]代码运行过程释放内存  发帖心情 Post By:2020/1/20 13:33:00 [只看该作者]

下面这段代码是根据“代码表”获取指定日期段的股piao历史数据,并填充到“股piao数据”表中,由于数据量很大,占用内存造成死机,如何在代码运行中释放内存,请各位老师指教,谢谢!!


Dim dm,dm1 As String
For Each dr As DataRow In DataTables("代码表").DataRows
    If dr.IsNull("简码") = False Then
        dm = dr("简码")
        If dm >= 600000 Then
            dm1 = "0" & dm
        Else
            dm1 = "1" & dm
        End If
    End If
    Dim obj_down As New System.Net.WebClient()
    Dim data As String = obj_down.DownloadString("http://quotes.money.163.com/service/chddata.html?code=" & dm1 & "&start=" & _sr & "&end=" & _zr & "&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP")
    data = data.Replace(vblf,"")
    Dim rs() As String = data.Split(vbcr)
    For i As Integer = 1 To rs.Length - 2
        Dim cs() As String = rs(i).Split(",")
        If cs.Length = 15 Then
            DataTables("股piao数据").LoadFilter = "股piao代码 = '" & dm & "' and 日期 >= '" & _sr & "' and 日期 <= '" & _zr & "'"
            DataTables("股piao数据").Load
            Dim pr1 As DataRow = DataTables("股piao数据").Find("股piao代码 = '" & dm & "'and 日期 = '" & cs(0) & "'")
            If pr1 Is Nothing Then
                Dim pr As DataRow = DataTables("股piao数据").Addnew()
                pr("日期") = cs(0)
                pr("股piao代码") = Right(cs(1),6)
                pr("名称") = cs(2)
                If cs(3) = "None" Then
                    pr("收盘价") = 0
                Else
                    pr("收盘价") = cs(3)
                End If
                If cs(4) = "None" Then
                    pr("最高价") = 0
                Else
                    pr("最高价") = cs(4)
                End If
                If cs(5) = "None" Then
                    pr("最低价") = 0
                Else
                    pr("最低价") = cs(5)
                End If
                If cs(6) = "None" Then
                    pr("开盘价") = 0
                Else
                    pr("开盘价") = cs(6)
                End If
                If cs(7) = "None" Then
                    pr("前收盘") = 0
                Else
                    pr("前收盘") = cs(7)
                End If
                If cs(8) = "None" Then
                    pr("涨跌额") = 0
                Else
                    pr("涨跌额") = cs(8)
                End If
                If cs(9) = "None" Then
                    pr("涨跌幅") = 0
                Else
                    pr("涨跌幅") = cs(9)
                End If
                If cs(10) = "None" Then
                    pr("换手率") = 0
                Else
                    pr("换手率") = cs(10)
                End If
                If cs(11) = "None" Then
                    pr("成交量") = 0
                Else
                    pr("成交量") = cs(11)
                End If
                If cs(12) = "None" Then
                    pr("成交金额") = 0
                Else
                    pr("成交金额") = cs(12)
                End If
                If cs(13) = "None" Then
                    pr("总市值") = 0
                Else
                    pr("总市值") = cs(13)
                End If
                If cs(14) = "None" Then
                    pr("流通市值") = 0
                Else
                    pr("流通市值") = cs(14)
                End If
                DataTables("股piao数据").Save()
            End If
        End If
    Next
Next

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


加好友 发短信
等级:超级版主 帖子:105948 积分:538809 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/1/20 13:52:00 [只看该作者]

使用sql,直接把数据插入数据库:http://www.foxtable.com/webhelp/topics/3266.htm

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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2020/1/20 21:10:00 [只看该作者]

代码修改后,空表的情况下,CPU和内存占用以及代码运行正常,但是当“股piao数据”表数据有1000多万行时,CPU和内存的占用就急剧上升(SQL Server Windows NT - 64 Bit),代码运行很卡,如何改善,还请有点蓝老师指教,谢谢!!


Dim dm,dm1 As String
For Each dr As DataRow In DataTables("代码表").DataRows
    If dr.IsNull("简码") = False Then
        dm = dr("简码")
        If dm >= 600000 Then
            dm1 = "0" & dm
        Else
            dm1 = "1" & dm
        End If
    End If
    Dim obj_down As New System.Net.WebClient()
    Dim data As String = obj_down.DownloadString("http://quotes.money.163.com/service/chddata.html?code=" & dm1 & "&start=" & _sr & "&end=" & _zr & "&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP")
    data = data.Replace(vblf,"")
    Dim rs() As String = data.Split(vbcr)
    For i As Integer = 1 To rs.Length - 2
        Dim cs() As String = rs(i).Split(",")
        If cs.Length = 15 Then
            DataTables("股piao数据").LoadFilter = "股piao代码 = '" & dm & "' and 日期 >= '" & _sr & "' and 日期 <= '" & _zr & "'"
            DataTables("股piao数据").Load
            Dim pr1 As DataRow = DataTables("股piao数据").Find("股piao代码 = '" & dm & "'and 日期 = '" & cs(0) & "'")
            If pr1 Is Nothing Then
                
                Dim cmd As new SQLCommand
                cmd.C  onnection Name = "GP2"
                cmd.CommandText = "Insert Into 股piao数据 (日期, 股piao代码,名称,收盘价,最高价,最低价,开盘价,前收盘,涨跌额,涨跌幅,换手率,成交量,成交金额,总市值,流通市值) Values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
                cmd.Parameters.Clear
                cmd.Parameters.Add("@日期",cs(0))
                cmd.Parameters.Add("@股piao代码",Right(cs(1),6))
                cmd.Parameters.Add("@名称",cs(2))
                If cs(3) = "None" Then
                    cmd.Parameters.Add("@收盘价",0)
                Else
                    cmd.Parameters.Add("@收盘价",cs(3))
                End If

                ‘------------

                If cs(14) = "None" Then
                    cmd.Parameters.Add("@流通市值",0)
                Else
                    cmd.Parameters.Add("@流通市值",cs(14))
                End If
                cmd.ExecuteNonQuery
            End If
        End If
    Next
Next

[此贴子已经被作者于2020/1/20 21:11:37编辑过]

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


加好友 发短信
等级:超级版主 帖子:105948 积分:538809 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/1/20 21:23:00 [只看该作者]

DataTables("股piao数据").LoadFilter = "股piao代码 = '" & dm & "' and 日期 >= '" & _sr & "' and 日期 <= '" & _zr & "'"
DataTables("股piao数据").Load

这2句代码完全就是多余的,而且还在循环里不停加载。作死的节奏。
直接使用sqlfind查询即可。或使用SQL查询



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


加好友 发短信
等级:七尾狐 帖子:1525 积分:10580 威望:0 精华:0 注册:2008/9/24 11:16:00
  发帖心情 Post By:2020/1/20 22:02:00 [只看该作者]

蓝老师,代码修改后,CPU占用有所改善,但是内存占用(尤其是SQL Server Windows NT - 64 Bit)依然很高,不知何故,还请指教,谢谢!



Dim pr As DataRow
            With DataTables("股piao数据")
                pr = .SQLFind("股piao代码 = '" & dm & "'and 日期 = '" & cs(0) & "'")
            End With
            If pr Is Nothing Then
                Dim cmd As new SQLCommand
                cmd.C
                cmd.CommandText = "Insert Into 股piao数据 (日期, 股piao代码,名称,收盘价,最高价,最低价,开盘价,前收盘,涨跌额,涨跌幅,换手率,成交量,成交金额,总市值,流通市值) Values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
                cmd.Parameters.Clear
                cmd.Parameters.Add("@日期",cs(0))
                cmd.Parameters.Add("@股piao代码",Right(cs(1),6))
                cmd.Parameters.Add("@名称",cs(2))
                If cs(3) = "None" Then
                    cmd.Parameters.Add("@收盘价",0)
                Else
                    cmd.Parameters.Add("@收盘价",cs(3))
                End If




图片点击可在新窗口打开查看此主题相关图片如下:捕获2.png
图片点击可在新窗口打开查看





图片点击可在新窗口打开查看此主题相关图片如下:捕获3.png
图片点击可在新窗口打开查看



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


加好友 发短信
等级:超级版主 帖子:105948 积分:538809 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/1/20 22:30:00 [只看该作者]

短时间内不停往数据库里添加数据,肯定就这样了。这个没有办法的,只能加大内存。

 回到顶部