Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 多次对单个文件执行grep_Linux_Performance_Indexing_Grep - Fatal编程技术网

Linux 多次对单个文件执行grep

Linux 多次对单个文件执行grep,linux,performance,indexing,grep,Linux,Performance,Indexing,Grep,我有一个登记号的档案。这些数字需要根据ID映射到另一个文件中,并使用该信息和补充的mysql数据库信息编写第三个文件。我有一个简单的程序,它读取文件(145Gb),提取登录号,然后使用grep命令将相应的ID查找到映射文件(10Gb)中。 因此,对于每个登录号,我执行一个grep: $ grep -m1 myAccession myMappFile 此操作执行多次。当我一次又一次地访问同一个文件时,我想知道是否有一种简单的方法来创建索引或某种bash魔法来提高性能,因为我需要处理大约4500万

我有一个登记号的档案。这些数字需要根据ID映射到另一个文件中,并使用该信息和补充的mysql数据库信息编写第三个文件。我有一个简单的程序,它读取文件(145Gb),提取登录号,然后使用grep命令将相应的ID查找到映射文件(10Gb)中。 因此,对于每个登录号,我执行一个grep:

$ 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补充信息,速度更快…谢谢!