Java:如何快速从大型文本文件中提取匹配行?
虽然意识到我的问题总的来说有很多解决方案, 在我的特殊情况下,我仍然不满意他们所需要的运行时 考虑一个FASTA格式的35G大型文本文件,如下所示: >Protein_1 So nice and cute little fella MTTKKCLQKFHLESLGKLGDSFLKYAISIQLFKSYENHYEGLPSIKKNKIISNAALFKLG YARKILRFIRNEPFDLKVGLIPSDNSQAYNFGKEFLMPSVKMCSRVK* >Protein_2 Fancy incredible description of its function MADDSKFCFFLVSTFLLLAVVVNVTLAANYVPGDDILLNCGGPDNLPDADGRKWGTDIGS […] etc. 有没有人知道如何将其加速到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
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();