首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改进过程的执行时间

改进过程的执行时间
EN

Stack Overflow用户
提问于 2015-11-17 08:38:36
回答 4查看 69关注 0票数 0

我需要您的帮助,以便及时改进下面的Java过程。程序步骤如下:

  • 我有一个有超过一百万条记录的表(主键是自动增量)。
  • 我从这个表中选择最小和最大主键值。
  • 我根据最小值和最大值创建了一些初始的'fromRange‘和'toRange’变量
  • 在创建一个循环之后,每次处理20000条记录: 我取“fromRange”到“toRange”之间的记录 对于每次返回的记录,我都会将(每次追加)写入XML对象(使用JAXB)。 编写在磁盘上的文件上创建的XML对象之后。 增加'fromRange‘和'toRange’以继续下一个记录。

过程结束后,所有记录已被处理。

这个执行需要超过12个小时在一个正常的PC上完成。我想知道如何改进这段代码以更快地导出文件。也许用线程?

谢谢

EN

回答 4

Stack Overflow用户

发布于 2015-11-17 08:43:36

我取“fromRange”到“toRange”之间的记录

我取“fromRange”到“toRange”之间的记录

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

当然,您应该自己分析这一点,并看到线程在很多时候被阻塞。如果是,是的,多线程是有效的。

票数 0
EN

Stack Overflow用户

发布于 2015-11-17 08:49:01

评论:

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

这是可以的,因为它是主键,它有一个自动索引的数据库管理系统。

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

您可以通过DMBS函数的第一行和最后一行来实现这一点。这是非常有选择性的,不需要太长时间

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

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

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

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

通常,您需要做一些跟踪,以查看哪一步消耗了大部分时间。

票数 0
EN

Stack Overflow用户

发布于 2015-11-17 08:49:55

同时做所有的工作肯定会更好。保持主线程从数据库中读取,但读取所有记录,即select * from MyTable order by myId

然后通过调用Executors工厂(如newCachedThreadPool )中的一个方法来创建newCachedThreadPool

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

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

如果您想要更高级的解决方案,可以考虑为此使用Apache,特别是SQL示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33752396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档