我有一個帶有編號的文件。這些數字需要映射到另一個文件的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,但它幾乎是一樣的...
不知道,但這可能有所幫助:https://stackoverflow.com/questions/42239179/fastest-way-to-find-lines-of-a -text文件從 - 另一側大文本bash中的文件 – Sundeep
你能提供一個更完整的[示例](https://stackoverflow.com/help/mcve) – Thor
謝謝@Sundeep,但不同的用例。 – jcoder8