2017-02-26 177 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是一個使用的步驟。

相關問題