2017-02-26 178 views
3

重复的道歉,但我无法通过阅读其他帖子来解决此问题。我正在尝试运行计算密集型迭代算法。下一个迭代是由函数“更新”给予我通过使用迭代时超出了Clojure GC开销限制

(def iterates (doall (take 1000 (iterate update initial-state)))) 

收集所有的迭代,其中初始状态是与我对算法进行初始化第零迭代。不幸的是,我不能提供一个最简单的例子...更新是一个相当复杂的函数,它将地图数据结构作为输入并输出更新的地图数据结构。代码运行良好,总迭代次数可达800次,但对于任何更大的事件,都会产生下面的错误。一般的观点是,仅仅增加垃圾收集器的可用尺寸是不够的,因为这可能是一个更深层次问题的症状(可能)。在其他文章中提出的问题是非常具体的,但我的更新功能非常复杂。那么我怎么能在这里提供的一般性中解决这个问题呢?我可以使用某些工具吗?

  1. 通过java.lang.OutOfMemoryError GC开销限制所致超过

     Double.java: 519 java.lang.Double/valueOf 
         Numbers.java: 611 clojure.lang.Numbers$DoubleOps/multiply 
         Numbers.java: 148 clojure.lang.Numbers/multiply 
          core.clj: 21 ssm4clj.core/corr 
          core.clj: 6 ssm4clj.core/corr 
          core.clj: 42 ssm4clj.core/innovation 
          core.clj: 40 ssm4clj.core/innovation 
          core.clj: 2522 clojure.core/partial/fn 
          core.clj: 2646 clojure.core/map/fn 
         LazySeq.java: 40 clojure.lang.LazySeq/sval 
         LazySeq.java: 49 clojure.lang.LazySeq/seq 
          RT.java: 521 clojure.lang.RT/seq 
          core.clj: 137 clojure.core/seq 
          core.clj: 2654 clojure.core/map/fn 
         LazySeq.java: 40 clojure.lang.LazySeq/sval 
         LazySeq.java: 49 clojure.lang.LazySeq/seq 
         Cons.java: 39 clojure.lang.Cons/next 
          RT.java: 688 clojure.lang.RT/next 
          core.clj: 64 clojure.core/next 
        protocols.clj: 168 clojure.core.protocols/fn 
        protocols.clj: 124 clojure.core.protocols/fn 
        protocols.clj: 19 clojure.core.protocols/fn/G 
        protocols.clj: 31 clojure.core.protocols/seq-reduce 
        protocols.clj: 75 clojure.core.protocols/fn 
        protocols.clj: 75 clojure.core.protocols/fn 
        protocols.clj: 13 clojure.core.protocols/fn/G 
          core.clj: 6545 clojure.core/reduce 
          core.clj: 6527 clojure.core/reduce 
          core.clj: 347 ssm4clj.core/mean-conditional 
          core.clj: 319 ssm4clj.core/mean-conditional 
           REPL: 332 ipp4clj.multiplexing/update-single-gp-mean 
           REPL: 329 ipp4clj.multiplexing/update-single-gp-mean 
    
+1

一组1000个状态占用多少内存?你是否有可能没有足够的内存来存放这么多的数据,以及你正在进行的计算所创建的额外垃圾? –

+0

你需要所有的国家,或者只是一个达到目标?我不知道你是否可以使用'drop'和'take'来放弃状态?或者是“结合”第一个“时间”? –

+0

@SamEstep,当我“顶部”进程时,%MEM列中的百分比大约为30。检查顶部的文档,%MEM显示任务当前使用的可用物理内存的份额。这是我的理解,该过程只使用我的RAM的30%。 – Lindon

回答

1

要使用@ StefanKamphausen的评论一起去。我认为jvisualvm也会帮助你很多。 Here是一个使用的步骤。

相关问题