加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala Concurrency减速

发布时间:2020-12-16 18:13:55 所属栏目:安全 来源:网络整理
导读:我这样做的前提是我是一个相对的 Java / Scala新手,所以我不排除有一些明显我不做的事情. 我有一个Scala应用程序,它通过Hibernate连接到MySQL数据库.该应用程序旨在处理大量数据,大约2,750,000条记录,因此我尝试尽可能地优化它. 它运行在我的工作站上,这是一
我这样做的前提是我是一个相对的 Java / Scala新手,所以我不排除有一些明显我不做的事情.

我有一个Scala应用程序,它通过Hibernate连接到MySQL数据库.该应用程序旨在处理大量数据,大约2,750,000条记录,因此我尝试尽可能地优化它.

它运行在我的工作站上,这是一台配备6Gb RAM(1033Mhz)的QuadCore Intel Xeon,它可以很好地和快速地运行前70k记录,在大约15分钟内完成.到那时,它已达到90k,大约需要25分钟,因此有些东西让它慢慢爬行.

我已经检查了Hibernate代码上的计时器,数据库检索的时间与往常一样.我甚至试图强制手动垃圾收集尝试这样做,但这也不起作用.

有问题的代码看起来像:

val recordCount = repo.recordCount
val batchSize = 100
val batches = (0 to recordCount by batchSize).toList
val batchJobs = {
    for (batchStart <- batches) yield {
        future(new RecordFormatter().formatRecords(new Repo(sessionFactory.openSession),batchStart,batchSize)
    }
awaitAll(100000,batchJobs: *_)

在RecordFormatter内部(实际上没有命名,如果你想知道我的命名方案疯狂),它会对接下来的100条记录进行查询,然后再查询另一条查询来拉回实际记录(在起始值和结束值之间使用)然后将它们以CSV格式写入文本文件.查看定时器输出,记录格式化程序中的每个操作大约需要5秒钟来拉回记录,然后需要0.1秒来将其输出到文件.

尽管如此,一旦它减速,它只处理大约12批100每分钟的记录,而不是在该过程首次启动时每分钟40个批次的100个记录.

它定期刷新Session并在每个RecordFormatter运行结束时关闭它(每个RecordFormatter都有自己的会话).

我主要是在寻找Scala和期货的任何已知问题.我注意到,当它放慢速度时,它似乎并没有使用所有八个可能的线程,这可以解释速度的下降,但对我来说这是一个谜,为什么它会突然停止并始终在75k记录标记附近.

谢谢!

编辑:更新的代码,以显示它使用yield和awaitAll,以防有所作为.

解决方法

与JDK捆绑在一起的jconsole应用程序(在$JAVA_HOME / bin / jconsole中)可用于在运行时附加到应用程序.这非常适合告诉你一些事情:

>该应用程序是否将所有时间花在GC上?
>应用程序线程在做什么?

你能在这里公布结果吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读