【问题标题】:Scala how many futures can I createScala我可以创建多少个期货
【发布时间】:2014-03-25 09:09:33
【问题描述】:
val iter = (1 to 1000).iterator.map { i =>
  accountService.getAccountDataSyncList(i, 200)
}.takeWhile(_.nonEmpty).flatten.map(acc => produceReport(acc.bindAccount))
Future.sequence(iter.toList)

我迭代了 1 到 1000 页的帐户,最多创建 200 * 1000 个期货,

这会占用大量内存吗?

这是create all task as future then forget 模式性能友好吗?

【问题讨论】:

  • 这取决于您的问题中未提及的许多事情。也许可以优化你的算法,这样你就不会创建数万或数十万个期货。这也取决于工作有多“重”。毕竟,为什么不尝试一下呢?
  • 您似乎认为每个Future 都有一个线程。肯定不是这样的。 Future 实例的固定空间开销(实际上是一个特征,因此可以有多个实现)是适度的。在大多数系统上创建 200,000 个它们是没有问题的(当然任何桌面或服务器——移动或嵌入式是另一回事)。
  • @RandallSchulz 谢谢,我使用的是 512MB 堆 ​​Java 虚拟机。所以我决定不使用我的 vm oom 重构这段代码。

标签: scala future reactive-programming


【解决方案1】:

需要多少内存取决于您的每个回调需要多少内存以及您指定执行期货的线程数。

【讨论】:

  • 我认为所有的期货都是在它们开始执行之前创建的。
  • @jilen 从java对象的角度来看你是对的,它们都是在每个启动之前创建的
  • 一个future对象本身通常不会占用太多内存,除非你有太多的对象,而当它的方法运行时它确实会占用内存。不过,GC 一直是 Java 的大敌。
  • @Light 我试过了,gc不是这里的敌人。但是我发了太多任务,cpu现在很忙,负载转到10+
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2017-03-23
  • 2015-08-13
相关资源
最近更新 更多