改善程序的执行时间

时间:2015-11-17 08:38:36

标签: java

我希望得到您的帮助,以便及时改进Java中的以下过程。 程序步骤如下:

  • 我有一个包含超过一百万条记录的表(主键是自动增量)。
  • 我从此表中选择最小和最大主键值。
  • 我创建了一些来自Land' from theRange'和' toRange'基于最小值和最大值的变量
  • 创建循环后,每次处理20000条记录:

    我在' fromRange'之间取得了记录。直到' toRange'

    对于每个记录返回,我写(每次附加)到XML对象(使用JAXB)

    在我写入在磁盘上的文件上创建的XML对象之后。

    增加' fromRange'和' toRange'继续下一个记录。

在所有记录处理完毕后,程序结束。

此执行在普通PC上完成需要12个多小时。我想知道如何改进这段代码 更快地导出文件。也许使用线程?

由于

4 个答案:

答案 0 :(得分:0)

  

我在' fromRange'之间取得了记录。直到' toRange'

  

我在' fromRange'之间取得了记录。直到' toRange'

IO步骤,阻止计算。多线程是确保以最佳方式使用机器资源的解决方案。

当然,您应该自己对此进行分析,并发现线程在很多时候都被阻止了。如果是,是的,多线程有效。

答案 1 :(得分:0)

评论:

  • 我有一个包含超过一百万条记录的表(主键是自动增量)。

没关系,因为它是主键,它自动成为DBMS的大部分索引。

  • 我从此表中选择最小和最大主键值。

您可以通过DMBS功能的第一行和最后一行执行此操作。那是非常有选择性的,不应该花很长时间

  • 我根据最小值和最大值创建了一些初始的'fromRange'和'toRange'变量

大多数现代DMBS可以将其索引保存为B *树。这意味着你有一个树结构,它可以非常快速地找到一个值,然后通过一个链表来链接叶子,这样就可以快速找到愤怒。所以这也应该是有选择性的,不要花太多时间。

  • 创建循环后,每次处理20000条记录

我会尝试创建一个Java对象,最后通过JAXB进行序列化。

一般来说,你需要做一些追踪,看看哪个步骤大部分时间消耗。

答案 2 :(得分:0)

并行完成所有工作肯定会更好。保持主线程从数据库中读取所有记录,即select * from MyTable order by myId

然后通过调用Executors工厂中的一种方法创建ExecutorService,如newCachedThreadPool

然后在主线程中继续循环记录,并为每个记录发送executor.submit(new Runnable() { doYourWork(record); }, null);。请注意record必须是副本,因为它将从不同的线程访问!

最后致电executor.shutdown()executor.awaitTermination()。您可以通过调用get()方法返回的Future上的submit来检查潜在错误。

另一种方式,如果您需要更高级的解决方案,可以考虑使用 Apache Camel ,特别是SQL example

答案 3 :(得分:0)

您的问题不完整:没有总计数,没有数据库类型,没有关于记录大小的信息。但总的来说:

  1. 不要使用max / min - 只需选择所有记录并迭代它们
  2. 注意在JDBC中获取大小参数。这是你应该设置20000
  3. 的地方
  4. 在流媒体模式下使用JAXB(请参阅JAXB fragment
  5. 不要忘记Outputstream缓冲