改进我的文件i / o算法

时间:2009-06-09 18:58:11

标签: javascript algorithm optimization file-io

对于给定的一组文本文件,我需要找到每个“\”字符并将其替换为“\\”。这是一个Windows系统,我的脚本语言选项是Javascript,VBScript或Perl。

这些文件很大(大约10MB),并且有很多(~15,000)。我已经提出了以下Javascript:

function EscapeSlashes(inFilePath)
{
    var readOnly = 1;
    var fso  = WScript.CreateObject("Scripting.FileSystemObject");
    var outFile = fso.CreateTextFile(inFilePath + "escaped.js", true);
    var inFile = fso.OpenTextFile(inFilePath, readOnly);

    var currChar;
    while(!inFile.AtEndOfStream)
    {
        currChar = inFile.Read(1);

        //check for single backslash
        if(currChar != "\\")
        {
            outFile.Write(currChar);
        }
        else
        {
            //write out a double backslash
            outFile.Write("\\\\");
        }
    }

    outFile.Close();
    inFile.Close();
}

我担心上述情况可能会有点慢。有没有办法改进算法?由于我用一个字符替换一个字符,我不认为这可以就地完成。

逐行阅读是否有任何性能优势,而不是逐个字符?

在这种情况下,Perl或VBScript是否比Javascript有任何优势?

5 个答案:

答案 0 :(得分:4)

你不能这样做,但通常最好以块的形式读取数据,而不是一次读取一个值。读取一个块,然后遍历它。读取另一个块等 - 直到“块”的长度为0,或者对Read的调用指示流的结束。 (在大多数平台上,对Read的调用可以指示而不是必须调用单独的AtEndOfStream函数。)

另外,如果Perl可以在一行中做到这一点,我也不会感到惊讶。如果可以,请使用sed:)

答案 1 :(得分:3)

我建议读取和写入更大的块(无论是行还是大量字节)。这应该减少您需要执行的IO并允许您更快地运行。但是,您的文件可能太大而无法在内存中轻松操作。使用读/写大小播放并查看最快的内容。

答案 2 :(得分:3)

perl -spi.og -e 's/\\/\\\\/gm' infile

将你的infile重写并将infile.og作为你的备份。

答案 3 :(得分:2)

这是Perl构建的任务,几乎肯定会更快,但前提是您已经熟悉该语言。话虽这么说,您可以通过读取更大的缓冲区并使用正则表达式替换来轻松调整JavaScript代码。看看String.replace方法。

答案 4 :(得分:0)

像乔恩说的那样,Perl可能是个不错的选择 如果可以,请使用cygwin(我认为它具有此类所需的工具)。