如何预防;“内存不足”;使用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位访问?