2011-07-06 86 views
2

我有一個巨大的製表符分隔文件。 (10,000行爲主題,> 1百萬次檢測爲列)。 我有一個映射文件,其中包含與100萬列中的每一列相關的信息。 我需要爲每個主題,對於每個分析,(對於每個單元格)查看映射文件並獲取一些值並替換現有值。這是可並行的嗎?

在Python或Perl中,我將不得不通讀每一行,將其拆分,並在映射文件中查找每個單元格。

在R中,我可以一次讀取每列,並且所有行都可以從映射文件中獲取信息。

無論哪種方式,遍歷每行或每列的整個過程佔用大量時間,因爲每個單元格查找都需要完成。

有沒有一種方法可以並行化?我應該怎麼想,如果我想並行化並使其更快?

另外,我有興趣學習如何在map/reduce風格中處理這個問題嗎?

樣本數據文件如下:(製表符分隔的)

ID S1 S2 S3 S4 S5 
1 AA AB BA BB AB 
2 BA BB AB AA AA 
3 BA AB AB AB AB 
4 BA AB AB BB AA 
5 AA AB BA BB AB 
6 AA BB AB AA AA 

映射文件如下:

SID Al_A Al_B  
S1 A  C 
S2 G  T 
S3 C  A 
S4 G  T 
S5 A  C 

所以在數據文件中,在每一個細胞中,每一個A和B,必須在映射文件中查找A映射到的內容(來自Al_A列)以及B映射到的內容(來自Al_B列)。

+1

您能描述映射文件嗎? – ikegami

+1

您可以給出一小段數據(幾行和幾列,分析)以及片段的相關映射文件/數據,以便我們可以看到您正在談論的那類事情? R是矢量化的,因此您可以使用基於合併或每個整列的基於索引的替換,以並行方式處理單列。 –

+0

在R中,您可以讀取單獨核心中的單個列。如果不測試這是否會提高速度,我無法判斷。 –

回答

5

簡單的並行

python parse.py assays.txt | python lookup.py mapping.txt | python reformat.py >result.txt 

凡parse.py讀取的「試驗」文件「10,000個受試者爲行和> 100萬測定欄目」它只是分析,到標準輸出寫入數據。

lookup.py讀取「爲其獲取一些值」映射來填充內部字典。它讀取stdin數據,執行查找並將結果寫入stdout。

reformat.py讀取stdin並重新格式化它以寫入最終報告,該報告似乎是鏡像輸入結構的。儘管這並不是「尷尬地」平行,但它確實將作業分解爲一些平行的並行步驟。這是意外強勁,可以刮鬍子一些時間過程


你可能想什麼,但是,是什麼,反映問題的易並行性質。有10,000 * 1,000,000 == 100億個人價值觀,所有這些看起來都是完全獨立的。

另一種(更復雜的)方法是這樣的。這取決於http://docs.python.org/library/multiprocessing.html

  1. 一個簡單的閱讀器Process分區輸入文件,記錄寫入ň不同Queue秒。這意味着每個Queue獲得10,000/n記錄。n可以是10到100之間的大數。是的。 100個隊列,每個隊列都有100條記錄。如果他們等待安排在您的服務器上少量的內核上,那就沒問題了。核心將100%忙碌。這是好事。

  2. 每個ÑQueue S的被工人Process它執行查找的東西每次測定中的記錄,並把所得到的記錄爲輸出Queue提供服務。你可以調整n到各種各樣的值看看會發生什麼。在某種程度上,更多的工人會放慢速度。很難預測這個級別在哪裏,所以試驗。

  3. 輸出Queue由工作人員Process讀取,它簡單地將輸出文件與其在隊列中找到的內容格式化。

這意味着你需要某種形式的「分析」對象的,你可以從輸入文件和排隊序列化爲一個Python

1

正如我理解您的問題每個數據單元都獨立於其他的,鑑於此,有一種非常簡單的方法可以在不更改任何預先存在的代碼的情況下對其進行並行化。您只需要使用命令行工具split來預處理數據文件即可。然後,將每個文件與您擁有的任何預先存在的代碼並行處理。最後,最後把它們全部收回。

以下是你可能想要做的命令的例子:

split -l 100 data_file.tsv data_ 
ls data_* | xargs -L 1 perl your_processing_file.pl 
cat output_* > total_output 
rm output_* 

這裏假設你的腳本將採取與名data_中$ X文件,並創建輸出名稱output_ $ x的一個新的文件,你可能不得不稍微改變它。

這實際上是一種非常普遍的方法來並行化這樣的問題。