我正在阅读大小约为20 MB的文件,其中包含大约500,000条记录。我正在将记录加载到HashMap中,其中特定字段为键,另一个字段为值。此Map的键值用于后续过程。
简单阅读文件的时间可以忽略不计。但是,解析字段并加载到HashMap似乎需要数小时。代码看起来有点喜欢这个,
InputStream in = new FileInputStream(new File(file));
br = new BufferedReader(new InputStreamReader(in), 102400);
if (br != null) {
for (String record; (record = br.readLine()) != null;) {
sb = new StringBuilder(record);
map.put(sb.substring(findStartIndex(fieldName1),findEndIndex(fieldName1)), sb.substring(findStartIndex(fieldName2),findEndIndex(fieldName2)));
}
}
其中findStartIndex()和findEndIndex()是解析记录格式xml并查找字段的开始和结束索引的方法。
我需要为一堆文件重复此过程。 建议我减少运行时间。任何帮助表示赞赏。感谢。
编辑:我实现了findStartindex和findEndindex,如下所示,
输入是带字段名称和索引值的xml。我为每个人使用了SaxParser,getter和setter ..找到了开始和结束的值。
答案 0 :(得分:2)
您可以使用BufferedReader
每秒读取数百万行。毫无疑问,时间在您未示出的XML解析中。看起来你没有使用正确的解析器,而是你显然只是在XML上进行字符串搜索,从字符串的开头开始,两次都是二次的,或者将每一行解析为XML四次,这是更差。不要那样做。使用XPath查找字段,速度更快,或者正确实现的SAX解析器监听器。
当你已经拥有这条线时,我认为没有任何理由在每条线上创建一个新的StringBuilder
。
NB br
在您测试时无法为空。