Java - 读取文件并在HashMap中加载 - 如何减少时间?

时间:2014-12-17 06:08:21

标签: java hashmap inputstream bufferedreader fileinputstream

我正在阅读大小约为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 ..找到了开始和结束的值。

1 个答案:

答案 0 :(得分:2)

您可以使用BufferedReader每秒读取数百万行。毫无疑问,时间在您未示出的XML解析中。看起来你没有使用正确的解析器,而是你显然只是在XML上进行字符串搜索,从字符串的开头开始,两次都是二次的,或者将每一行解析为XML四次,这是更差。不要那样做。使用XPath查找字段,速度更快,或者正确实现的SAX解析器监听器。

当你已经拥有这条线时,我认为没有任何理由在每条线上创建一个新的StringBuilder

NB br在您测试时无法为空。