如何提高Java中文件读取效率及其数据插入?

3

我们的生产环境中有一个每日运行的autosys作业。它调用一个shell脚本,该脚本又调用一个Java Servlet。这个Servlet读取这些文件并将数据插入到两个不同的表中,然后进行一些处理。Java版本是1.6,应用服务器是WAS7,数据库是oracel-11g。

我们遇到了许多问题,比如需要时间,会出现内存溢出等等。以下是我们编码此过程的方式的细节。请告诉我是否可以改进。

  1. 当我们使用BufferedReader读取文件时,readLine()方法返回的确实会在内存中创建大量字符串吗?这些文件包含4-5万行。所有记录都由换行符分隔。在Java中读取文件以实现效率是否有更好的方法?考虑到文件中的所有记录行长度都不相同,我找不到更好的方法。

  2. 当我们插入数据时,我们使用statement/prepared statement进行批处理。我们将所有文件记录放入一个批处理中。把批处理大小拆成若干个块是否真的对性能有所影响呢?

  3. 如果表没有定义索引或其他约束条件,并且所有列都是VARCHAR类型,则哪种操作速度更快:基于某些匹配条件插入新行还是更新现有行?


1
我们正在制作一个包含文件所有记录的批次。这就解释了为什么你的内存不足了... - Jon Skeet
1
如果你在性能方面也包括“不因内存问题而崩溃”,那么是的,如果你将批量插入分成较小的批次,那么你就不必将所有这些字符串存储在内存中。 - MxLDevs
插入新行的时间复杂度为O(1)。更新现有行的时间复杂度为O(N)。请定义一些索引。 - user207421
1个回答

1
  1. 读取文件

    使用BufferedReader很好。关键是要读取一堆行,然后处理它们。之后,再读取另一堆行,以此类推。这里的一个重要含义是,当你处理第二批行时,你不再引用前一批行。这样,你就确保不会不必要地保留内存空间。但是,如果你需要引用所有行,你可以增加堆大小,或者如果许多行是重复的,使用intern()或类似的技术来节省内存。

  2. 修改表格

    最好将批量大小限制在合理的数量。批量越大,对数据库端和可能也对JVM端施加的资源约束就越多。

  3. 插入或更新

    如果你定义了索引,我认为更新的性能更好。但是,如果没有索引,插入应该更好。(你有环境访问权限,也许你可以进行测试并与我们分享结果?)

最后,您还可以考虑使用多个线程来处理“修改表格”的部分,以提高整体性能和效率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接