2017-08-16 41 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文件,这是不是所需的输出....