以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]代码运行过程释放内存  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=145450)

--  作者:yyzlxc
--  发布时间:2020/1/20 13:33:00
--  [求助]代码运行过程释放内存
下面这段代码是根据“代码表”获取指定日期段的股票历史数据,并填充到“股票数据”表中,由于数据量很大,占用内存造成死机,如何在代码运行中释放内存,请各位老师指教,谢谢!!


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("股票数据").LoadFilter = "股票代码 = \'" & dm & "\' and 日期 >= \'" & _sr & "\' and 日期 <= \'" & _zr & "\'"
            DataTables("股票数据").Load
            Dim pr1 As DataRow = DataTables("股票数据").Find("股票代码 = \'" & dm & "\'and 日期 = \'" & cs(0) & "\'")
            If pr1 Is Nothing Then
                Dim pr As DataRow = DataTables("股票数据").Addnew()
                pr("日期") = cs(0)
                pr("股票代码") = 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("股票数据").Save()
            End If
        End If
    Next
Next

--  作者:有点蓝
--  发布时间:2020/1/20 13:52:00
--  
使用sql,直接把数据插入数据库:http://www.foxtable.com/webhelp/topics/3266.htm
--  作者:yyzlxc
--  发布时间:2020/1/20 21:10:00
--  
代码修改后,空表的情况下,CPU和内存占用以及代码运行正常,但是当“股票数据”表数据有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("股票数据").LoadFilter = "股票代码 = \'" & dm & "\' and 日期 >= \'" & _sr & "\' and 日期 <= \'" & _zr & "\'"
            DataTables("股票数据").Load
            Dim pr1 As DataRow = DataTables("股票数据").Find("股票代码 = \'" & dm & "\'and 日期 = \'" & cs(0) & "\'")
            If pr1 Is Nothing Then
                
                Dim cmd As new SQLCommand
                cmd.C  onnection Name = "GP2"
                cmd.CommandText = "Insert Into 股票数据 (日期, 股票代码,名称,收盘价,最高价,最低价,开盘价,前收盘,涨跌额,涨跌幅,换手率,成交量,成交金额,总市值,流通市值) Values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
                cmd.Parameters.Clear
                cmd.Parameters.Add("@日期",cs(0))
                cmd.Parameters.Add("@股票代码",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编辑过]

--  作者:有点蓝
--  发布时间:2020/1/20 21:23:00
--  
DataTables("股票数据").LoadFilter = "股票代码 = \'" & dm & "\' and 日期 >= \'" & _sr & "\' and 日期 <= \'" & _zr & "\'"
DataTables("股票数据").Load

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



--  作者:yyzlxc
--  发布时间:2020/1/20 22:02:00
--  
蓝老师,代码修改后,CPU占用有所改善,但是内存占用(尤其是SQL Server Windows NT - 64 Bit)依然很高,不知何故,还请指教,谢谢!



Dim pr As DataRow
            With DataTables("股票数据")
                pr = .SQLFind("股票代码 = \'" & dm & "\'and 日期 = \'" & cs(0) & "\'")
            End With
            If pr Is Nothing Then
                Dim cmd As new SQLCommand
                cmd.C
                cmd.CommandText = "Insert Into 股票数据 (日期, 股票代码,名称,收盘价,最高价,最低价,开盘价,前收盘,涨跌额,涨跌幅,换手率,成交量,成交金额,总市值,流通市值) Values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
                cmd.Parameters.Clear
                cmd.Parameters.Add("@日期",cs(0))
                cmd.Parameters.Add("@股票代码",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
图片点击可在新窗口打开查看



--  作者:有点蓝
--  发布时间:2020/1/20 22:30:00
--  
短时间内不停往数据库里添加数据,肯定就这样了。这个没有办法的,只能加大内存。