2017-08-16 158 views
3

我有一個帶有編號的文件。這些數字需要映射到另一個文件的ID,並與該信息和互補的MySQL數據庫信息編寫第三個文件。我有一個簡單的程序,它讀取文件(145Gb),提取登錄號,然後使用grep命令查找映射文件(10Gb)中的對應ID。 所以每個登錄號我在執行一個grep的:多次對單個文件執行grep

$ grep -m1 myAccession myMappFile 

該操作進行數次。由於我一遍又一遍地訪問同一個文件,我想知道是否有一種簡單的方法來創建一個索引或某種bash魔術來改善性能,因爲我必須處理大約45百萬種質。 我在〜3h處理了25萬份材料。因此處理45M將花費大約〜540H(22天!!),這是不相宜... 林意識到,我可以有一些完善發送一個grep的多個種質:

$ grep 'accession1\|accession2\|accession3' -m3 myMappFile 

但是這是不夠的。

也許是這樣的:

$ grep 'accession1\|accession2\|accession3' -m3 myIndexedMappFile 

注:數據庫進程已經改善,我已經極大地用一個HashMap所以肯定瓶頸位於grep的減少數據庫的訪問。

任何想法?

更新:

*File with accession:* 
>Accession_A other text 
other line 
... 
... 
>Accession_B more text 
more lines 
... 

*File with mappings* 
Col1 Accession_A ID-X Col4 
Col1 Accession_B ID-Y Col4 
... 
... 

所以程序讀取文件加入(逐行)提取Accession_N,然後用grep上的映射文件中加入。與所得的行,我提取的ID值和與該ID我尋找更多的數據到數據庫中,所以在最後我有一個文件:

Accession_A ID-X DB-DATA

Accession_B ID -Y DB-DATA

沒有文件排序。我將值{ID,DB-DATA}放入哈希映射中以避免數據庫開銷。

的程序編碼與Java的使用過程中給exec grep命令,以減少的Runtime.exec的開銷呼籲我已經嘗試同時運行多個國家加入的grep,但它幾乎是一樣的...

+0

不知道,但這可能有所幫助:https://stackoverflow.com/questions/42239179/fastest-way-to-find-lines-of-a -text文件從 - 另一側大文本bash中的文件 – Sundeep

+0

你能提供一個更完整的[示例](https://stackoverflow.com/help/mcve) – Thor

+0

謝謝@Sundeep,但不同的用例。 – jcoder8

回答

0

我已經解決了@ sundeep的建議,並在處理時間方面找到了解決方案,但是我認爲,當用戶需要在同一個文件上執行幾個grep時,仍然應該是一種更好的方法來改善用例。 我所做的是:

grep -e "^>" myBigFile.fa | cut -d">" -f2 | cut -d" " -f1 > all_accession.txt 

然後使用grep與文件參考

grep -F -f all_accession.txt myBigMappingFile > matchFile.txt 

最後使用java程序來處理:

首先從第一個文件中提取所有的登錄號matchFile.txt爲了讀取ID並創建目標文件(我的意思是讀取ID並查看數據庫中的補充信息)。

這三個步驟是在3.5hr進行,這是更可接受的。 然而,由於一起運行(因爲我從一開始就一直在嘗試),所以解決方案並未完成,也會生成其他輸出文件,最重要的是,具有在映射文件上沒有對應ID的文件的文件,因此,我嘗試使用下面的命令來生成文件:

grep -F -v -f all_accession.txt myBigMappingFile > matchFile.txt 

的grep,以便反選-v PARAM,但該命令還提供了有關那不上找到匹配的myBigMappingFile記錄all_accession.txt文件,這是不是所需的輸出....