在读取大文件时,在vbscript中出现系统内存不足的问题

时间:2016-08-17 17:29:00

标签: vbscript

我正在尝试在vbscript中进行一些文本替换。问题是该文件大150MB。下面是只删除标题行并删除空行的函数。

因为我怀疑它在strContents = objTS.ReadAll sub的cleanHeaderRow行给我一个“内存不足”的错误。此时我不确定此任务是否可以在VBScript中完成。但在我开始探索其他语言之前,任何建议都会受到欢迎。

Sub cleanHeaderRow(browse)
    MsgBox browse
    Const FOR_READING = 1
    Const FOR_WRITING = 2
    'strFileName = "C:\scripts\test.txt"
    strFileName = browse
    iNumberOfLinesToDelete = 1

    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
    strContents = objTS.ReadAll
    objTS.Close

    arrLines = Split(strContents, vbNewLine)
    Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)

    For i=0 To UBound(arrLines)
        If i > (iNumberOfLinesToDelete - 1) Then
            objTS.WriteLine arrLines(i)
        End If
    Next
End Sub

Sub DeleteBlankRows(browse)
    Const ForReading = 1
    Const ForWriting = 2
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(browse, ForReading)
    Do Until objFile.AtEndOfStream
        strLine = objFile.Readline
        strLine = Trim(strLine)
        If Len(strLine) > 0 Then
            strNewContents = strNewContents & strLine & vbCrLf
        End If
    Loop
    objFile.Close
    Set objFile = objFSO.OpenTextFile(browse, ForWriting)
    objFile.Write strNewContents
    objFile.Close
End Sub

1 个答案:

答案 0 :(得分:1)

您的程序都会将整个文件读入内存,即使它们以不同的方式进行操作。处理大文件的正确方法是打开文件,逐行处理,在读取输入时将输出写入临时文件,然后用临时文件替换原始文件。

示例:

filename = "..."

Set fso = CreateObject("Scripting.FileSystemObject")

Set inFile  = fso.OpenTextFile(filename)
Set outFile = fso.OpenTextFile(filename & ".tmp", 2, True)
Do Until inFile.AtEndOfStream
  If inFile.Line = 1 Then
    inFile.SkipLine                            'skip first line
  Else
    line = inFile.ReadLine
    If line <> "" Then outFile.WriteLine line  'write non-empty lines to output
  End If
Loop
inFile.Close
outFile.Close

fso.DeleteFile filename, True
fso.MoveFile filename & ".tmp", filename

这样你在任何给定时间内只有一行内存。但是,您可以为磁盘使用交换内存使用量,因为您为输出创建了第二个文件。