Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Java:如何快速从大型文本文件中提取匹配行?_Java_Performance_Text Files_Large Files_Fasta - Fatal编程技术网

Java:如何快速从大型文本文件中提取匹配行?

Java:如何快速从大型文本文件中提取匹配行?,java,performance,text-files,large-files,fasta,Java,Performance,Text Files,Large Files,Fasta,虽然意识到我的问题总的来说有很多解决方案, 在我的特殊情况下,我仍然不满意他们所需要的运行时 考虑一个FASTA格式的35G大型文本文件,如下所示: >Protein_1 So nice and cute little fella MTTKKCLQKFHLESLGKLGDSFLKYAISIQLFKSYENHYEGLPSIKKNKIISNAALFKLG YARKILRFIRNEPFDLKVGLIPSDNSQAYNFGKEFLMPSVKMCSRVK* >Protein_2 Fancy incred

虽然意识到我的问题总的来说有很多解决方案, 在我的特殊情况下,我仍然不满意他们所需要的运行时

考虑一个FASTA格式的35G大型文本文件,如下所示:

>Protein_1 So nice and cute little fella MTTKKCLQKFHLESLGKLGDSFLKYAISIQLFKSYENHYEGLPSIKKNKIISNAALFKLG YARKILRFIRNEPFDLKVGLIPSDNSQAYNFGKEFLMPSVKMCSRVK* >Protein_2 Fancy incredible description of its function MADDSKFCFFLVSTFLLLAVVVNVTLAANYVPGDDILLNCGGPDNLPDADGRKWGTDIGS […] etc. 有没有人知道如何将其加速到
grep
性能

非常感谢你的帮助。
干杯

如果您立即将其写入输出文件,而不是在内存中累积对象,那么它将提高性能(并且更像您使用grep时所做的)


使用多个线程可能会大大加快速度。如果文件的长度为X字节,并且有n个线程,则以X/n间隔启动每个线程,并读取X/n字节。您需要同步ArrayList,以确保正确添加结果。

提供fasta阅读器。 要读取大量文件,必须考虑使用A和使用ByTeFuffs。
biojava库使用bytebuffers。

您是否考虑过将“grep”称为外部进程?只需读取输出文件/STDUT,就可以得到几乎相同的性能。我将尝试实现一些SAX或STAX解析器。亲爱的Alessandro,我确实认为使用<代码> GRP作为一个外部过程,但这也必须在Windows上运行。嗨,Scadge!您确定SAX或StAX解析器可以加快这个过程吗?这可能与这个问题无关,但JAVA的List接口中是否有任何append()方法?我认为只有add()方法可以将对象放入ArrayList对象中。如果我错了,请纠正我。为什么这个答案被否决了?我很肯定这就是解决办法。如果您的文件是35Gib,那么您的
ArrayList
将需要大量内存。在最坏的情况下,这将耗尽您的物理内存,并且您的操作系统开始交换。当这种情况发生时,性能会大大降低。但是,即使您的内存足够大,JVM的性能也可能会下降,因为它在内存管理和垃圾收集方面的工作越来越多。使用你的操作系统统计数据来找出你的进程使用了多少内存和CPU。我明白你的意思。不过,我的用例稍微复杂一点。我想使用
ObjectOutputStream
存储蛋白质描述列表,以便能够在之后非常快速地加载它。我应该怎么做呢?如果你达到了RAM大小的物理极限,你就必须放弃在一个时间点将所有数据保存在内存中的想法,因为无论你使用什么格式,它都会非常慢。也许使用数据库(eg)会有所帮助?但是首先你应该按照我的建议检查你的进程的资源消耗。如果你知道从grep得到的文件的大小,那么你可以明智地使用StringBuffer或StringBuilder。或者使用上面提到的方法,然后读入新的输出文件。这听起来是个不错的解决方案。但是,我如何确保我将文件分割成以换行符结尾的块呢。否则我可能会错过至少一部分蛋白质描述,不是吗?你的搜索字符串只有2个字符。。。你可以从X/n-1开始读X/n+2个字符;这应该可以解决这个问题
public static void main(String[] args) throws Exception {
    BufferedReader fastaIn = new BufferedReader(new FileReader(args[0]));
    List<String> l = new ArrayList<String>();
    String str;
    while ((str = fastaIn.readLine()) != null) {
        if (str.startsWith(">")) {
            l.append(str);
        }
    }
    fastaIn.close();
    // …
}
...
BufferedWriter fastaOut = new BufferedWriter(new FileWriter(args[1]));
...
while ((str = fastaIn.readLine()) != null) {
        if (str.startsWith(">")) {
            fastaOut.write(str);
            fastaOut.newLine();
        }
    }
...    
fastaOut.close();