【发布时间】:2014-12-17 06:08:20
【问题描述】:
我正在读取大小约为 20 MB 的文件,其中包含大约 500,000 条记录。我将记录加载到一个 HashMap 中,其中一个特定字段作为键,另一个字段作为值。此 Map 的 Key-values 用于后续流程。
简单地读取文件的时间可以忽略不计。但是,解析字段并加载到 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.. 找到了 start 和 end 的值。
【问题讨论】:
-
实际需要多长时间?
-
嗯,是的,这很长。我认为 nhahtdh 是在正确的轨道上——我们需要看到更多的代码。还有
fieldName1和fieldName2这两个字段,是怎么设置的? -
你不能只在文件本身而不是在 StringBuilder 上实现解析器吗?
-
你需要做一些基本的分析来找出慢的地方。但是,简单的看一下似乎给我带来了几个问题: 1)在这里使用 StringBuilder 是没有意义的。您正在创建不必要的对象。 2)您可以预先分配地图以能够存储您需要的记录数,从而节省调整大小的时间。 3)最可疑的部分是你的
findStartIndex和findEndIndex。您提到您在其中使用 SAX 吗?为什么不能将 XML 解析为适当的对象并对其进行操作?对每个“索引”进行多次解析对我来说不是一个好主意。 -
你只解析文件一次吗?另外我不建议使用 sql。并且你可以使用一个线程读取文件和多个线程解析它们来获得更好的结果。
标签: java hashmap inputstream bufferedreader fileinputstream