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

Java—读取文件并在HashMap中加载—如何减少时间?,java,hashmap,inputstream,bufferedreader,fileinputstream,Java,Hashmap,Inputstream,Bufferedreader,Fileinputstream,我正在读取大小约为20MB的文件,其中包含大约500000条记录。我将记录加载到一个HashMap中,其中一个字段作为键,另一个字段作为值。此映射的键值将在后续过程中使用 简单读取文件的时间可以忽略不计。但是,解析字段并加载到HashMap似乎需要几个小时。代码看起来有点像这样 InputStream in = new FileInputStream(new File(file)); br = new BufferedReader(new InputStreamReader(in), 10240

我正在读取大小约为20MB的文件,其中包含大约500000条记录。我将记录加载到一个HashMap中,其中一个字段作为键,另一个字段作为值。此映射的键值将在后续过程中使用

简单读取文件的时间可以忽略不计。但是,解析字段并加载到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。。找到了开始和结束的值。

使用
BufferedReader
每秒可以读取数百万行。毫无疑问,现在正是进行XML解析的时候。看起来您没有使用合适的解析器,但是您显然只是在XML上进行字符串搜索,从字符串的开头开始搜索两次,这是二次的,或者将每一行解析为XML四次,这更糟糕。不要那样做。使用XPath查找字段,这会更快,或者是一个正确实现的SAX解析器侦听器

我不认为有什么好的理由在你已经有了行本身的情况下创建一个新的
StringBuilder


NB
br
在测试时不可能为空。

实际需要多长时间?嗯,是的,这相当长。我认为NHAHDH的做法是正确的——我们需要看到更多的代码。还有字段
fieldName1
fieldName2
,它们是如何设置的?你不能只在文件本身上实现解析器,而不是在StringBuilder上实现解析器吗?你需要做一些基本的分析来找出什么是慢的。然而,简单地看一下,我似乎发现了几个问题:1)在这里使用StringBuilder毫无意义。您正在创建不必要的对象。2) 您可以预先分配映射以能够存储所需的记录数,这样可以节省调整大小的时间。3) 最可疑的部分是您的
findStartIndex
findEndIndex
。你说过你在里面用SAX吗?为什么不能将XML解析为适当的对象并对其进行操作?对我来说,对每个“索引”进行多次解析不是一个好主意。是否只对文件进行一次解析?我也不建议使用sql。使用一个线程读取文件,使用多个线程解析文件,可以获得更好的结果。是的,
String
StringBuilder
更好。谢谢。。I’我会按你说的那样更改它。。我会告诉你时间:)。。谢谢,againI刚刚删除了对每条记录的解析。而是使用一次性解析并使用值。在不到一秒钟的时间内输出了500k条记录。希望能更有效地执行您的完整建议。谢谢非常感谢。如果我想从一个记录中对多个字段进行子串并需要连接它们,那么创建StringBuilder是否是正确的选择?就像上面for循环中的一些解析和连接一样。如果连接或删除/向字符串添加字符,最好使用
StringBuilder
。对于子字符串搜索,我认为两者具有相同的效率