2012-09-11 26 views
2

我有一個Perl腳本,它讀取兩個文件並處理它們。並行處理多個文件

第一個文件 - 信息文件 - I將其存儲爲一個散列(3.5 GB)

第二個文件 - taregt文件 - 我通過使用從信息文件和其他子程序信息按照設計處理。 (此文件,目標,範圍從30 - 60 GB)

到目前爲止的工作是:

  • 讀取信息文件到一個哈希
  • 打破了目標文件到 塊

我想在平行於所有塊運行:

while(chunks){ 
    # do something 

    sub a {} 
    sub b {} 
} 

所以BASICA lly,我想讀取一個塊,寫出它的輸出,並在同一時間爲多個塊執行此操作。 while循環讀取塊文件的每一行,並調用各種子例程進行處理。

有沒有辦法,我可以讀取背景數據塊的方式?

我不想讀信息的文件,每一塊,因爲它是3.5GB長,我讀它變成亂碼,這會佔用3.5GB每次。

眼下腳本需要1 - 2小時爲30-60gb運行。

+0

有很多過濾和丟棄的,所以整個目標文件的outout是500MB的〜我 –

+0

所期望的OS讀的背景下一塊,甚至沒有被要求! – ikegami

+3

你說這個文件是3.5GB,並且保存它的散列是3.5GB ......我非常懷疑這一點。哈希值可能會更多。 – ikegami

回答

1

您可以嘗試使用Perl threads如果並行任務是獨立的。

+0

進程(分叉)對於這個任務會更好。 – snoofkin

+0

你能指點我一個關於流程(分叉)的快速教程嗎?謝謝 ! –

1

3.5GB散列非常大,您應該考慮使用數據庫來代替。根據你如何做到這一點,你可以通過散列來訪問數據庫。

如果記憶是一個不是問題的問題,fork ING將是最簡單的解決方案。但是,這會重複該過程,包括散列,並且只會導致不必要的交換。

如果不能釋放一些內存,你應該考慮到use threads。 Perl線程只存在於解釋器內部,並且對操作系統不可見。這些線程與fork ing類似,但是,您可以聲明變量爲:shared。 (你必須use threads::shared

看到官方Perl threading tutorial

1

關於什麼的模塊File::Map(內存映射),它可以方便讀取大文件。

use strict; 
use File::Map qw(map_file); 

map_file my $map, $ARGV[0]; # $ARGV[0] - path to your file 
# Do something with $map 
+0

感謝您的建議艾農和fxzuz。我正在研究線程和File :: Map。 我需要的是線程不同的輸出。是的,這些塊是獨立的。 我不想去數據庫的方式,因爲我需要的關鍵信息(不知道如何工作:))) –