2014-02-19 38 views
1

我试图获取一大组PDF文件(300.000)中的页面总数。我写的剧本有效,但错误与'内存不足'。在TaskManager中,我看到内存使用量逐渐增加。计算大量pdf文件中的页数:内存不足

这是File :: Find的标准行为吗?有没有人有另一种方法?

#!/usr/bin/perl 

use File::Find; 
use PDF::API2; 

$totalpages = 0; 

sub pagesPDF { 
    return unless -f; 
    my $fullpath = $File::Find::name; 
    my $pdf = PDF::API2->open($fullpath); 
    my $pages = $pdf->pages; 
    $totalpages += $pages;  
} 

find (\&pagesPDF, "G:/MYDIR/1"); 


print "Total pages of pdf pages = $totalpages\n"; 
+2

有没有'close'方法? – reto

+0

@reto我查看了PDF :: API2的规格。似乎没有一个密切的方法。 –

+2

您是否测试过$ pdf-> end()是否删除文件?我知道它宣称破坏文件,而不是对象,但这实际上会让我感到惊讶。为什么会有专门销毁pdf文档的方法?我会假定它实际上干净地销毁对象,希望能够正确关闭文件。 – DeVadder

回答

1

显然,文档是有点古怪这里制定。 $pdf->end()似乎并没有破坏所述的文件,但正确地销毁该对象,从而关闭文件。

1

你可以试试这个,它可以帮助:

sub pagesPDF { 
    return unless -f; 
    my $fullpath = $File::Find::name; 
    my $pdf = PDF::API2->open($fullpath); 
    my $pages = $pdf->pages; 
    $totalpages += $pages; 
    undef $pdf;  
} 

,或者你可以我们一个不同的方法:

sub pagesPDF { 
    return unless -f; 
    my $fullpath = $File::Find::name; 
    my $pages = `/usr/bin/pdfinfo $fullpath | grep 'Pages:'| cut -f2- -d":"`; 
    $pages =~ s!\D+!!gis; 
    $totalpages += $pages;  
} 
+0

第二个版本听起来像是最省钱的方法。 – DeVadder

+0

'undef $ pdf'在这里不太可能有用 - 当子程序结束时,词汇变量$ pdf变量超出范围时,对象的引用计数将降为零,并被销毁。使用'undef'手动删除引用具有相同的效果,所以它应该只用于全局变量,或者当您在范围离开之前需要释放某些内容时。这里也不是这种情况。 – amon

相关问题