2011-04-11 115 views
0

我在perl中爲一個消息板遷移做了一個翻譯器,我所做的只是應用正則表達式並打印結果。我寫stdout到一個文件,現在我們開始吧!但問題是我的程序在寫入18 MB後無法工作!Perl文件處理大小有限?

我做了一個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,以使用所有內核,但腳本停在可變大小。當它停止時,「尾部」命令不顯示任何URL上的複雜消息...

謝謝!我讓你知道,如果我管理終於

+0

會有什麼hapen,當你刪除任何東西,但打印'從環print'?你有相同的文件嗎? – 2011-04-12 08:10:31

+0

由於您從sql轉儲文件中一次解析一行,因此如果標記恰好跨越多行(這是完全有效的HTML),則很多正則表達式不匹配。這實際上取決於你的sql轉儲文件是如何格式化的。如果每行有一條INSERT語句(在您的HTML內容中帶有轉義換行符),那麼您應該可以繼續使用您的策略。 – 2011-04-12 09:00:32

回答

1

讓人驚訝 - 從基礎開始:

use strict; 
use warnings; 

..at你的腳本的頂部。它會抱怨沒有正確地宣佈你的詞彙,所以繼續做下去。我沒有看到任何明顯的東西會截斷你的文件,但也許你的一個或多個正則表達式是病態的。另外,最後的undefs不是必需的。

對於你在做什麼,你可能只使用sed

+0

你好,謝謝你,我添加了這兩行,並聲明$ html和$ file爲my();但它不會進步。 我無法翻譯sed的正則表達式(嘗試和幾乎丟失和小時) – Dextair 2011-04-11 23:05:05

0

Perl可以肯定處理超過18 MB更大的文件考慮。我知道,因爲我經常通過Perl運行5 GB的文件。

我認爲你的問題在while($html=<FILE>)

只要$html設置爲空行,while將評估爲False並退出循環。

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

編輯:

嗯。我一直以爲你需要defined,但在我剛纔的測試中,它並沒有以空行或0結束。必須是更多的特殊Perl魔法,它們大部分都是按照你的意圖工作 - 除非它不是。

事實上,如果您足夠重構while循環,則可以讓Perl按照我一直認爲它工作的方式工作。 (它可能有,在Perl 4或更早版本的Perl 5)

這將失敗:

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

[不正確。](http://stackoverflow.com/questions/3773917/whats-the-most-defensive-way-to- loop-through-line-in-a-file-with-perl) – CanSpice 2011-04-11 22:16:23

+1

空行是「\ n」,這是真的。關於添加defined()(它實際上在遇到'while(VAR = READLINE)'模式時由perl實際添加的)的偏執狂只是在沒有換行符的尾隨行'0'的情況下才需要。 – ysth 2011-04-11 23:18:03

+0

@ ysth:不,那不是。如果你解析while循環,你會發現編譯器就是你的朋友。 – tchrist 2011-04-12 00:40:41

0

有可能進行的任何數量的事情:

  1. 嘗試增加$| = 1;到您的腳本的頂部。這將使所有輸出無緩衝。
  2. 你的一個正則表達式變得瘋狂,並且在你不期待的時候正在刪除字符串。
  3. 您的磁盤空間不足。

有沒有什麼不對您的腳本(而不是你缺少use strict; use warnings;和你不使用的open()的三個參數的形式),這將導致其停止後,一些神奇的字節數的工作。

+0

謝謝, 我添加了$ | = 1,沒有任何移動。但爲了記錄,我將15分鐘的25分鐘的大轉儲分開,並且我平行翻譯了8次translate.pl。每個進程卡在一個可變的大小,所以我不認爲這是一個緩衝區的問題,事實上,腳本不會停止,但我只是看到大小($ watch ls -lah myfile)不會增加傳遞所有 – Dextair 2011-04-11 23:08:36

1

你說「腳本停止」。它繼續運行,但沒有產生更多的輸出?或者實際上停止運行?如果它停止運行,哪些呢:

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

說明了什麼?如果你在循環後添加print STDERR "done!\n";,那麼顯示出來了嗎?

+0

一段時間!文件後面的時間會有所不同(得到25 MB的15 MB) – Dextair 2011-04-13 21:47:22

+0

@Dextair:這樣腳本會一直持續下去嗎?你等了多久?也許嘗試安裝pv實用程序並運行'pv mydump.sql | perl translate.pl - > mydump-bbcode.sql',看看它顯示了什麼? – ysth 2011-04-13 21:59:10

0

大家好,非常感謝您的幫助和建議! 在嘗試剪切並行化作業之後,我嘗試在3個程序中切換我的程序,translate1.pl,translate2.pl和3 ...作業完成,並且由8個活動核心快速完成!

然後我的launcher.sh連續啓動每個分割文件的3個腳本。有2個循環完成,我們開始吧:)

問候,約恩·