我使用Excel VBA清理大型csv文件。为此,我将csv文件加载到访问数据库,然后使用SQL查询我执行所有数据转换活动。所以抽象的过程就像这样
打开Excel - >在开始时单击包装访问数据库 - >将csv文件加载到不同的表 - >使用adoddb连接在数据库上执行不同的DDl和DML语句 - >输出最终数据。
我在这里遇到的问题是内存使用率总是上升为excel。似乎访问数据库处理也被添加到excel本身。所以我最终得到错误"System Resource Exceeded"
。
每次执行查询。内存使用率很高,永远不会下降。查询在3-4个表中大约有10k到100k记录。
为什么内存使用率永远不会降低?
每次我执行ddl / dml查询时,都会打开adodb连接并关闭它。我在使用后关闭所有记录集并设置为空。但是内存使用率仍然没有下降。
看到相关的不同文章。但大多数人都在讨论同一个excel文件中的数据。在我的情况下,没有数据保存在内存或excel文件中。
我在这里看到一篇来自微软的文章,其中也谈到了excel本身的数据。 https://support.microsoft.com/en-us/kb/319998
有人知道任何解决方法吗?
例如:要从csv文件向表中加载数据,请使用以下代码
StrSql = "SELECT * into " & TableName & " FROM [Text;FMT=Delimited;HDR=YES;DATABASE=" & DSPath & "].[" & DSName & "]"
ExecuteSQL StrSql
Private Function ExecuteSQL(Sql As String) As Long
Dim Con As ADODB.Connection
Dim I As Long
Connect Con
Con.Execute Sql, I
ExecuteSQL = I
CloseCon Con
End Function
Public Sub CloseCon(ByRef Con As ADODB.Connection)
If Not Con Is Nothing Then
If Con.State = adStateOpen Then
Con.Close
Set Con = Nothing
End If
End If
End Sub
Public Sub Connect(ByRef Con As ADODB.Connection)
Dim ConStr As String
If Not Con Is Nothing Then
If Con.State = adStateOpen Then
Exit Sub
End If
End If
On Error GoTo err
CloseCon Con
Set Con = New ADODB.Connection
ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBFile & ";Persist Security Info=False"
Con.Open ConStr, , , -1
Exit Sub
err:
End Sub
这有点帮助。
每次打开和关闭时都不使用单独的连接对象,而是尝试使用从开头打开并仅在完成进程时关闭的公共连接对象。这样,内存消耗减少,流程运行的时间更长
答案 0 :(得分:2)
您的代码看起来很合理。问题是Microsoft在您的引用中确认:“ ADO查询使用的内存无法通过关闭和释放ADO对象来回收。释放内存的唯一方法是退出Excel。 < / p>
所以我们现在必须退出Excel然后回收资源。
“退出Excel”表示必须关闭您工作的当前工作簿,或
“退出Excel”表示退出所有Excel实例,以便有效地从内存中删除Excel。
广告。 1:在这种情况下,您可以创建一个“父工作簿”,启动包含ADODB处理的一部分的另一个工作簿。它在部分处理之后退出,并且您的父级启动一个新的,另一个继续处理的工作簿,等等。使用一些智能切割&amp;粘贴以调整何时退出每个工作簿。
广告2:在这种情况下,您使用例如单词以启动Excel.Application的新实例并以与1相同的方式继续。只是希望MS-Office不是那么集成,以至于当任何Office程序运行时ADO DLL都不会退出...
当然,抱怨微软确认您的IT部门手头有错误,安装Access UI可能会更好。