我有一个带有编号的文件。这些数字需要映射到另一个文件的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