0

我尝试全球化变量和 undef ,增加 unix 中的数据段空间,本地化变量,但仍然得到相同的错误。我需要处理大约 750 个文件。有人可以帮忙吗?谢谢。我知道将整个文件读入字符串可能是个问题。但我不确定其他任何方式。但是,当我将字符串声明为全局并使其成为 ="" 时,仍然如此。应该在下一次迭代中释放内存吗?

foreach my $file_name (@dir_contents) 
{

if(-f "rawdata/$file_name")
{
$xmlres="";
eval {

while(<FILE>)
{
    $xmlres.=$_;
}
close FILE;


 ***$doc=$parser->parsestring($xmlres);***  
foreach my $node($doc->getElementsByTagName("nam1"))
{
    foreach my $tnode($node->getElementsByTagName(("name2")))
    {
        //processing
    }
}
}

} }

4

2 回答 2

3

首先,样式注释是有用且正确的,并且会有所帮助。但是,如果您需要处理 1.5Gb 的 XML,则需要更好地管理内存。

XML::DOM不会自动释放它使用的空间。这是它年代久远的标志,较新的模块可以更好地管理内存,并且倾向于自动执行此操作(我也使用XML::LibXML,它可以做到这一点,我也强烈推荐它)。

dispose主要是,当你完成一个 DOM 树时,你需要调用该方法来清理它。这在XML::DOM. 只需调用它就足以解决您的内存问题。(从技术上讲,DOM 树往往包含循环引用,这些在简单的引用计数垃圾收集中不会自动管理。Perl 使用了弱引用来辅助,但看起来这还没有XML::DOM完全集成。简单地取消引用树不是足够。)

我当然会寻求在其他地方改善风格。其他一些风格问题;我会尝试Try::Tiny处理eval {},因为您似乎主要将它用于异常处理。此外,一些糟糕的经历告诉我,使用可靠的日期/时间解析器总是一个好主意。我使用DateTime::Format::*. 日期和时间解析中有很多奇怪的情况,这将节省您的代码行并使处理更加可靠。

于 2011-07-12T13:45:32.737 回答
2

XML::DOM 陈旧且有限(更不用说我认为它不再被维护了)。试试 XML::LibXML,它非常相似(它也实现了一个 DOM),除了更快、更节省内存、更强大(完整的 XPath 实现......)、维护......

于 2011-07-12T11:12:51.983 回答