以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]代码运行过程释放内存 (http://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 |
-- 作者:有点蓝 -- 发布时间:2020/1/20 22:30:00 -- 短时间内不停往数据库里添加数据,肯定就这样了。这个没有办法的,只能加大内存。 |