2014-02-19 37 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

相關問題