【问题标题】:Java - Reading a file and loading in HashMap - How to reduce time?Java - 读取文件并在 HashMap 中加载 - 如何减少时间?
【发布时间】: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 是在正确的轨道上——我们需要看到更多的代码。还有fieldName1fieldName2这两个字段,是怎么设置的?
  • 你不能只在文件本身而不是在 StringBuilder 上实现解析器吗?
  • 你需要做一些基本的分析来找出慢的地方。但是,简单的看一下似乎给我带来了几个问题: 1)在这里使用 StringBuilder 是没有意义的。您正在创建不必要的对象。 2)您可以预先分配地图以能够存储您需要的记录数,从而节省调整大小的时间。 3)最可疑的部分是你的findStartIndexfindEndIndex。您提到您在其中使用 SAX 吗?为什么不能将 XML 解析为适当的对象并对其进行操作?对每个“索引”进行多次解析对我来说不是一个好主意。
  • 你只解析文件一次吗?另外我不建议使用 sql。并且你可以使用一个线程读取文件和多个线程解析它们来获得更好的结果。

标签: java hashmap inputstream bufferedreader fileinputstream


【解决方案1】:

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

当您已经拥有一行时,我认为没有任何充分的理由为每行创建一个新的 StringBuilder

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

【讨论】:

  • 是的,String 会是比StringBuilder 更好的选择
  • 谢谢.. 会按照你说的修改它.. 然后告诉时间:).. 再次感谢
  • 我刚刚删除了每条记录的解析。而是使用了一次解析并使用了这些值。在不到一秒的时间内输出了 50 万条记录。希望,如果实施您的完整建议,效率会更高。谢谢。非常感谢..
  • 如果我想从一条记录中提取多个字段并需要连接它们,那么创建 StringBuilder 是不是正确的选择?就像上面 for 循环中的更多解析和连接一样。
  • 如果将字符连接或删除/添加到字符串,最好使用StringBuilder。对于子字符串搜索,我认为两者的效率相同
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 2015-01-07
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多