【问题标题】:perl memory usage when processing a file inline内联处理文件时的 perl 内存使用情况
【发布时间】:2014-08-22 06:26:00
【问题描述】:

我有一个 CGI 脚本,我们的员工使用该脚本从他们无法直接访问的服务器中获取日志。由于我不会深入讨论的原因,在最近对我们的应用程序进行更新后,其中一些日志现在已经将换行符、制表符、反斜杠等字符翻译成它们的文本等价物。因此,我修改了 CGI 脚本以调用以下命令将它们转换回其原始值:

perl -i -pe 's/\\r/\r/g && s/\\n/\n/g && s/\\t/\t/g && s/\\\//\//g' $filename

我刚刚得知有些人在尝试获取相当大(几百 MB)的日志时出现内存不足错误。

我的问题:当调用这样的内联命令时,perl 如何管理内存?它是读入整个文件,处理它,然后将其写出,还是创建一个临时文件,一次处理输入文件中的行,然后在完成后替换文件?

这是在 64 位 Amazon linux 实例上使用 perl 5.10.1。

【问题讨论】:

    标签: perl


    【解决方案1】:

    -p 开关创建一个while(<>){...; print} 循环以迭代输入文件中的每一“行”。

    如果您的所有换行符都已转换为"\\n",那么您的文件将只是一个很长的行。因此,您的命令会将整个文件加载到内存中以执行修复。

    为避免这种情况,您必须有意使用sysread$/ 缓冲文件。

    创建一个实际脚本而不是单行脚本来完成这项工作可能是最简单的。但是,如果您知道所有换行符都已转换,那么一个简单的解决方法是使用 $/ = "\\n"

    作为辅助说明,您的正则表达式存在缺陷。您目前正在使用快捷操作符列出您的翻译s///。如果任何一个较早的正则表达式与特定行不匹配,则不会尝试其他翻译。您应该改为使用简单的分号来分隔您的正则表达式:

    's/\\r/\r/g; s/\\n/\n/g; s/\\t/\t/g; s|\\/|/|g'
    

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2017-05-08
      • 2012-08-17
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多