Perl文件处理的大小有限?

时间:2011-04-11 21:58:33

标签: regex perl shell translation

我在perl中创建了一个用于留言板迁移的翻译器,我所做的只是应用正则表达式并打印结果。我将stdout写入文件,然后我们开始了!但问题是我的程序在18 MB写完后无法工作!

我做了一个translate.pl(https://gist.github.com/914450) 并使用此行启动它: $ perl translate.pl mydump.sql> mydump-bbcode.sql

对于代码质量真的很抱歉但我从不使用perl ...我尝试使用sed进行相同的工作,但没有设法应用我在原始脚本中找到的正则表达式。

[编辑] 我重新编写代码并清理了一些正则表达式(请参阅gist.github.com/914450),但我仍然卡住了。当我在15M文件中拆分大转储时,我启动了translate.pl 7(进程)7来使用所有内核,但脚本停止在可变大小。 “tail”命令在任何URL停止时都不会显示复杂的消息...

谢谢大家!我告诉你,如果我最终管理

5 个答案:

答案 0 :(得分:1)

yikes - 从基础知识开始:

use strict;
use warnings;

..在脚本的顶部。它会抱怨没有正确宣布你的词汇,所以继续这样做。我没有看到任何明显的截断你的文件,但也许你的一个或多个正则表达式是病态的。此外,不需要最后的undefs。

对于您正在做的事情,您可以考虑使用sed

答案 1 :(得分:1)

你说“脚本停止”。它继续运行但不再产生输出?或者实际上停止运行?如果它停止运行,那么:

perl translate.pl mydump.sql > mydump-bbcode.sql
echo $?

显示?如果你在循环后添加print STDERR "done!\n";,那会显示吗?

答案 2 :(得分:0)

Perl当然可以处理大于18 MB的文件。我知道因为我经常通过Perl运行5 GB的文件。

我认为您的问题出在while($html=<FILE>)

每当$html设置为空行时,while将评估为False并退出循环。

您需要使用while( defined( $html = <FILE> ) )

之类的内容

编辑:

嗯。我一直认为你需要defined,但在我的测试中,它现在没有退出空行或0.必须更多的那种特殊的Perl魔法,大部分按你想要的方式工作 - 除非它没有“T

事实上,如果你重新调整while循环,你可以欺骗Perl,让我按照我一直认为的方式工作。 (它可能在Perl 4或早期版本的Perl 5中)

这将失败:

$x = <>;
chomp $x;
while( $x ) {
    print $x;
    $x = <>;
    chomp $x;
}

答案 3 :(得分:0)

可能会发生任何事情:

  1. 尝试将$| = 1;添加到脚本的顶部。这将使所有输出都无缓冲。
  2. 你的一个正则表达式变得疯狂,并且在你不期待的时候删除字符串。
  3. 你的磁盘空间不足。
  4. 你的脚本没有什么问题(除了你缺少use strict; use warnings;并且你没有使用open()的三参数形式)会导致它在一些魔法之后停止工作字节数。

答案 4 :(得分:0)

大家好,非常感谢您的帮助和想法! 在尝试剪切和并行化作业之后,我尝试在3个程序中剪切我的程序,translate1.pl,translate2.pl和3 ...工作已完成,并且它的速度快8个活动核心!

然后我的launcher.sh连续为每个分割文件启动3个脚本。用2个循环完成,我们在这里:)

此致,Yoann