2015-08-14 61 views
0

我正在使用此代码将字符串写入TXT文件。Scripting.FileSystemObject在写入方法上内存不足

它适用于文件< 40mbs然而,我试图保存的TXT会有点大~45mb,并且在获取到.write行时出现“内存不足”的错误。

Private Sub SaveToTXT(FilePath As String, FileContents As String) 
    Dim fso As Object 
    Dim oFile As Object 
    FileManagementFactory.DeleteIfExists (FilePath) 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set oFile = fso.CreateTextFile(FilePath) 
    Call oFile.Write(FileContents) 
    Call oFile.Close 
    Set fso = Nothing 
    Set oFile = Nothing 
End Sub 

任何想法如何绕过这个问题?

+0

使用OpenTextFile方法,它允许您附加到文件。那么你可以分割字符串并将其写入块中。 https://msdn.microsoft.com/en-us/library/314cz14s(v=vs.84).aspx – Sorceri

回答

0

在这里,试试这个。

Private Sub SaveToTXT(FilePath As String, FileContents As String) 
    Dim nFileNum As Integer: nFileNum = FreeFile 
    Open FilePath For Binary Lock Read Write As #nFileNum 
    Put #nFileNum, , FileContents 
    Close #nFileNum 
End Sub 
+0

我认为写每一行比写一次要慢很多。例如,我可能会尝试每写一行10000行。 – lisovaccaro

+0

这正是我想要的,你知道我如何分割它每N行例如?所以我把它写成两三个字。而不是一行一行地写? – lisovaccaro

+0

真的没有其他选择。你可以尝试ADO,但这是关于所有。第二种选择是放弃VBA并使用VB.Net来做你所需要的。 –

0

这就是我最后做的,它将文件以20,000,000个字符串分隔开。在我的测试中,它似乎超过了内存限制。

Private Sub SaveToTXT(FilePath As String, FileContents As String) 
    Dim fso As Object 
    Dim oFile As Object 
    Dim l As Long 
    Dim CharactersPerChunk As Long 
    CharactersPerChunk = 20000000 
    FileManagementFactory.DeleteIfExists (FilePath) 
    Set fso = CreateObject("Scripting.FileSystemObject") ' A lot faster than ADODB.Stream 
    Set oFile = fso.CreateTextFile(FilePath) 
    l = 0 
    While l < Len(FileContents)/CharactersPerChunk 
     Call oFile.Write(Mid(FileContents, (l * CharactersPerChunk) + 1, CharactersPerChunk)) 
     l = l + 1 
    Wend 
    Call oFile.Close 
    Set fso = Nothing 
    Set oFile = Nothing 
End Sub 
+0

您是否尝试过我上次编辑后张贴的二进制写入功能?它有一些错误,但我修正了这些错误。 –

+0

我没有时间去尝试,我会尝试在接受答案之前测量哪个更快。 – lisovaccaro

+0

你应该继续尝试我刚刚发布的更新代码。它超高效,运行速度比上面提到的要快(〜171毫秒vs 343毫秒)让我知道它是否也解决了内存问题。 –