【问题标题】:Improving my file i/o algorithm改进我的文件 i/o 算法
【发布时间】:2010-11-01 14:14:49
【问题描述】:

对于一组给定的文本文件,我需要找到每个“\”字符并将其替换为“\\”。这是一个 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 有什么优势吗?

【问题讨论】:

    标签: javascript algorithm optimization file-io


    【解决方案1】:

    您无法在原地执行此操作,但通常最好以块的形式读取数据,而不是一次读取单个值。读取一个块,然后遍历它。读取另一个块,等等 - 直到“块”的长度为 0,或者对 Read 的调用指示流的结束。 (在大多数平台上,调用 Read 可以表明您不必调用单独的 AtEndOfStream 函数。)

    此外,如果 Perl 可以在一行中完成此操作,我不会感到惊讶。或者如果可以的话,使用sed :)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我建议读取和写入更大的块(无论是行还是大量字节)。这应该会减少您需要执行的 IO 并让您运行得更快。但是,您的文件可能太大而无法在内存中轻松操作。玩转读/写大小,看看什么是最适合您的。

        【讨论】:

          【解决方案4】:
          perl -spi.og -e 's/\\/\\\\/gm' infile
          

          会留下你的 infile 重写和 infile.og 作为你的备份。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-22
              • 2012-05-01
              • 2010-12-25
              • 2010-12-23
              • 1970-01-01
              相关资源
              最近更新 更多