【发布时间】:2016-12-29 03:59:22
【问题描述】:
我正在使用 java 中的 BufferedReader 读取大型日志文件。我必须过滤文件的内容并将数据存储在数据库中。 例子。
BufferedReader br=new BufferedReader(new FileReader("test.log"));
String line;
while((line=br.readLine())!=null){
if(line.contains("filter1") || line.contains("filter2") ||
line.contains("filter3") || line.contains("filter4")...){
//creating object and storing using hibernate
}
}
我有超过 50 个这样的过滤器,并且在读取超过 100 MB 的文件时会出现问题。匹配这些过滤字符串浪费了很多时间。
如果条件是读取的行的子字符串,我不能使用 Collection.contains(line) 作为过滤器。花费的时间不是IO,而是过滤内容和创建对象进行存储。
编辑 1 :- filter1, filter2 只是为了简单起见。在实际情况下,过滤器就像 - “新文件”、“报告”、“从文件夹中删除”、“模式”、“移动”、“复制”、“添加到队列”、“唯一 id”等。这些是我检查该行是否包含用于存储的相关数据的特定关键字。
请提出一个更好的方法来实现同样的目标。
【问题讨论】:
-
尝试使用来自
org.apache.commons.lang3.StringUtilscommons.apache.org/proper/commons-lang/apidocs/org/apache/…的containsAny方法 -
如前所述,您无能为力来改进它。如果您需要检查一行是否包含 50 个字符串之一,您可能需要从头到尾查找所有 50 个字符串。如果您对字符串的潜在位置有更多了解,或者如果字符串 A 没有出现,那么可以肯定字符串 B 没有出现等等,您可以稍微改进一下。或者您可以使用专门的方法使用 trie 进行搜索,这样您就不必扫描每个字符串的整行。
标签: java regex memory optimization filereader