2016-04-19 84 views
0

使用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 

这有助于一点点。

而不是每次打开和关闭使用一个单独的连接对象我试图使用一个公开的连接对象,它是从开始打开,只有当过程完成时关闭。通过这种方式,内存消耗减少,并且进程运行更多时间。

+1

为什么不直接在Access中执行所有操作?似乎没有必要从Excel去操纵Access。 –

+0

我们没有安装访问界面。只需使用喷气发动机。所以用户可以打开Excel工具并提供输入。 – kten

+0

你可以发布代码吗? –

回答

1

您的代码看起来很健全。问题是在参考确认微软:“由ADO查询使用的内存无法通过关闭被回收和释放ADO对象来释放内存的唯一方法是退出Excel

所以我们。现在必须退出Excel,然后回收资源。

  1. “退出Excel”意味着从您正在使用当前工作簿必须被关闭,或者

  2. “退出Excel”意味着要辞去所有实例的Excel,因此Excel可以有效地从内存中删除。

Ad。 1:在这种情况下,您可以创建一个“父工作簿”来启动另一个包含ADODB处理一部分的工作簿。它在部分处理后退出,并且父母启动一个新的其他工作簿,继续处理等。使用一些智能切割&粘贴来调整何时退出每个工作簿。

广告2:在这种情况下,您可以使用例如Word启动Excel.Application的一个新实例,并按照与1相同的方式继续。只是希望MS-Office不那么集成,以便在任何Office程序运行时ADO DLL不会退出...

当然,向微软证实抱怨你的IT部门安装Access UI的bug可能会更好。

+0

嗯是的它是有道理的。即使它涉及相当数量的开销。它看起来没有其他解决方法。无论如何,我发现连续开放和关闭连接的一个部分问题,我在问题本身发布 – kten