使用Excel VBA清理大型csv文件。爲此,我將csv文件加載到訪問數據庫中,然後使用sql查詢執行所有數據轉換活動。因此,抽象過程如下Excel -Access DB -ADO。內存泄漏 - >超出系統資源
打開Excel - >開始單擊打包訪問數據庫 - >將csv文件加載到不同的表 - >使用adoddb連接執行不同的DDl以及數據庫上的DML語句 - >輸出最終數據。
我在這裏面臨的問題是內存使用總是由excel增加。它似乎訪問數據庫處理也添加到Excel本身。所以最終我得到了錯誤"System Resource Exceeded"
。
每次執行查詢時。內存使用率高漲並永遠不會下降。這些查詢在3-4個表中大約有10k到10萬條記錄。
爲什麼內存使用永遠不會下降?
每當我做一個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
這有助於一點點。
而不是每次打開和關閉使用一個單獨的連接對象我試圖使用一個公開的連接對象,它是從開始打開,只有當過程完成時關閉。通過這種方式,內存消耗減少,並且進程運行更多時間。
爲什麼不直接在Access中執行所有操作?似乎沒有必要從Excel去操縱Access。 –
我們沒有安裝訪問界面。只需使用噴氣發動機。所以用戶可以打開Excel工具並提供輸入。 – kten
你可以發佈代碼嗎? –