Linux 多次对单个文件执行grep
我有一个登记号的档案。这些数字需要根据ID映射到另一个文件中,并使用该信息和补充的mysql数据库信息编写第三个文件。我有一个简单的程序,它读取文件(145Gb),提取登录号,然后使用grep命令将相应的ID查找到映射文件(10Gb)中。 因此,对于每个登录号,我执行一个grep:Linux 多次对单个文件执行grep,linux,performance,indexing,grep,Linux,Performance,Indexing,Grep,我有一个登记号的档案。这些数字需要根据ID映射到另一个文件中,并使用该信息和补充的mysql数据库信息编写第三个文件。我有一个简单的程序,它读取文件(145Gb),提取登录号,然后使用grep命令将相应的ID查找到映射文件(10Gb)中。 因此,对于每个登录号,我执行一个grep: $ grep -m1 myAccession myMappFile 此操作执行多次。当我一次又一次地访问同一个文件时,我想知道是否有一种简单的方法来创建索引或某种bash魔法来提高性能,因为我需要处理大约4500万
$ grep -m1 myAccession myMappFile
此操作执行多次。当我一次又一次地访问同一个文件时,我想知道是否有一种简单的方法来创建索引或某种bash魔法来提高性能,因为我需要处理大约4500万次访问。
我在~3小时内处理了25万份申请。因此,45米的处理过程将需要约540小时(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
...
...
因此,程序读取加入文件(逐行)提取加入,然后在映射文件上对该加入进行grep。使用结果行,我提取ID值,并使用该ID在数据库中搜索更多数据,因此最后我有一个文件,其中包含:
加入A ID-X DB-DATA
加入B ID-Y DB-DATA
没有文件被排序。我将值{ID,DB-DATA}放入哈希映射以避免DB开销
这个程序是用java编写的一个使用进程来执行grep命令,以减少运行时的开销。exec调用我曾尝试使用多个访问同时运行grep,但它几乎是一样的 我已经研究了@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并创建目标文件(使用process,我的意思是读取ID并查看数据库中的补充信息)
这三个步骤在3.5小时内执行,这是更可接受的。
但是,该解决方案并不完整,因为同时运行(正如我从一开始就一直尝试的那样)还会生成其他输出文件,最重要的是,该文件的访问在映射文件上没有相应的id,因此我尝试使用以下命令生成该文件:
grep -F -v -f all_accession.txt myBigMappingFile > matchFile.txt
grep with-v param以反转选择,但该命令也会给出myBigMappingFile上的记录,该记录在all_accession.txt文件上找不到匹配项,该文件不是所需的输出….不确定,但这可能会有所帮助:你能提供一个更完整的感谢@Sundeep但不同的用例吗?当然可以@Thor我正在处理it@Sundeep你发布的链接绝对有帮助!我没有在同一个程序上运行所有步骤,而是先清理了登录文件,然后用$grep-F-F cleaned.file map.file>match.file将其映射到映射文件,现在java程序只读取平面文件,并用DB补充信息,速度更快…谢谢!