Scala Concurrency减速
我这样做的前提是我是一个相对的
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上? 你能在这里公布结果吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |