如何预防;“内存不足”;使用access VBA上载文件时出错?
我循环浏览一个文件夹,并尝试使用以下代码将文件夹中的每个文件上载到文档管理系统:如何预防;“内存不足”;使用access VBA上载文件时出错?,vba,file,ms-access,upload,out-of-memory,Vba,File,Ms Access,Upload,Out Of Memory,我循环浏览一个文件夹,并尝试使用以下代码将文件夹中的每个文件上载到文档管理系统: Dim webRequest As MSXML2.XMLHTTP60: Set webRequest = New MSXML2.XMLHTTP60 Call webRequest.Open(HTTPPost, adress, False) Const Boundary As String = "AaB03x" Call webRequest.setRequestHeader(HTTPHeaderValueCon
Dim webRequest As MSXML2.XMLHTTP60: Set webRequest = New MSXML2.XMLHTTP60
Call webRequest.Open(HTTPPost, adress, False)
Const Boundary As String = "AaB03x"
Call webRequest.setRequestHeader(HTTPHeaderValueContentType, "multipart/form-data;boundary=" & Boundary)
Call webRequest.setRequestHeader(HTTPHeaderValueCallingApplication, get_sys_db)
Call webRequest.setRequestHeader("Connection", "Keep-Alive")
Call webRequest.setRequestHeader("cache-control", "no-cache")
Dim byteData As Variant
With CreateObject("ADODB.Stream")
.Type = StreamType.Binary
.Mode = StreamMode.ReadWrite
.Open
Call .LoadFromFile(fileName)
byteData = .Read 'Somethimes here I get the "out of memory" error
End With
'dim requestData as Variant
With CreateObject("ADODB.Stream")
.Mode = StreamMode.ReadWrite
.Charset = WindowsCharset
.Open
.Type = StreamType.Text
Dim uploadFilename As String
uploadFilename = ZConverter.VariantToString(cut_file(fileName))
.WriteText CreateContentDisposionText("itemName", uploadFilename, Boundary)
.WriteText CreateContentDisposionText("parentNickname", parentNickname, Boundary)
.WriteText vbNewLine & "--" & Boundary & vbNewLine & "Content-Disposition: form-data; name=""file""; filename=""" & fileName & """" & vbNewLine
.WriteText vbNewLine
.Position = StreamPositionStart
.Type = StreamType.Binary
.Position = .Size
.Write byteData
Set byteData = Nothing
.Position = StreamPositionStart
.Type = StreamType.Text
.Position = .Size
.WriteText vbNewLine & vbNewLine & "--" & Boundary & "--" & vbNewLine
.Position = StreamPositionStart
.Type = StreamType.Binary
Call webRequest.Send(.Read) 'Here I get the "out of memory" error most of the time
End With
因此,这对小文件很有效
但是当我试图上传一个420MB的文件时,我得到了一个错误:“没有足够的内存来完成这个任务”(原文:“Für diesen Vorgang ist nicht genügend Speicher verfügbar”)。打开VBE(开发环境)时,即使有20MB的文件也会失败
访问需要约55 mb ram(带闭合VBE)和140 mb(带开放VBE)。由于内存使用率总是下降到这个值,我认为没有内存泄漏
所以:当计算机上有>3GB的可用ram时,有没有办法扩展ram以供访问?
如果没有,有没有办法改变代码,这样一次就不需要那么多内存
更新:
我是如何上传文件的,这是我关于堆栈溢出的问题的结果:您可以尝试每次关闭流,也可以使用实际的库,因此不创建对象,而不是100%@Nathan_Sav:我在每个“结束于”之前添加了一个.Close但我看不到任何变化。我不明白为什么要将流数据读入字节数组,然后将该字节数组写入流,然后将该流读回字节数组,然后发送它。这样会导致整个文件在内存中至少保存4次,而在内存中最多保存两次。然而,理想情况下,您可以使用分块上传(这样一次只需在内存中存储几个KB),但这是一个相当高级的主题。@Erik a:我不认为文件一次在内存中存储4次。我把它装进过道里。然后我将其加载到另一个流中并删除第一个流。然后我将其加载到webRequest中。但是我当然愿意用其他的方法来做这件事。我如何上传文件是我在堆栈溢出问题上的一个结果:是否加载了Rubberduck?这是一个有用的外接程序,但会对主机进程的可用内存造成损失-是32位还是64位访问?您可以尝试每次关闭流,也可以使用实际的库,因此不创建对象,而不是100%@Nathan_Sav:我在每个“结束于”之前添加了一个.Close但我看不到任何变化。我不明白为什么要将流数据读入字节数组,然后将该字节数组写入流,然后将该流读回字节数组,然后发送它。这样会导致整个文件在内存中至少保存4次,而在内存中最多保存两次。然而,理想情况下,您可以使用分块上传(这样一次只需在内存中存储几个KB),但这是一个相当高级的主题。@Erik a:我不认为文件一次在内存中存储4次。我把它装进过道里。然后我将其加载到另一个流中并删除第一个流。然后我将其加载到webRequest中。但是我当然愿意用其他的方法来做这件事。我如何上传文件是我在堆栈溢出问题上的一个结果:是否加载了Rubberduck?它是一个有用的外接程序,但在主机进程可用内存方面会付出代价——是32位还是64位访问?