2016-05-23 3 views
2

私はレコードツリーからEDNファイルに処理する700 MBのXMLファイルを持っています。Clojure:なぜこの作家はヒープスペースを消費しますか?

すべての処理を済ませた後、最終的には、特に大きな値ではない(ほとんどの場合10個の値)ハッシュマップのレイジーシーケンスがあります。終了するには

、私はdoseqがメモリ内のシーケンスの頭を保持しないことになっているので、私は問題を理解していない

(defn write-catalog [catalog-edn] 
    (with-open [wrtr (io/writer "catalog-fr.edn")] 
    (doseq [x catalog-edn] 
     (.write wrtr (prn-str x))))) 

のファイルにそれを書きたいです。

最終出力catalogclojure.lang.LazySeqです。

私はその後

(write-catalog catalog) 

を行うその後、メモリ使用量は、粉砕され、私は、3GのXMXとファイルwritterの80メガバイトの周りでのGCのオーバーヘッドエラーを持っています。

私もdoseq + spitで、またprn-strと同じことが起こりました。

これは正常な動作ですか?おそらく

おかげ

答えて

2

catalog値の実現のためにメモリリーク(「ヘッドの保持」をグーグル)。 write-catalogがアイテムを1つずつ実現すると、それらはメモリに保持されます(明らかにdefの指catalogのどこかにあります)。これを修正するには、カタログに変数を保存しないようにして、代わりにwrite-catalogに一度に渡してください。あなたは(私はあなたの前の質問を考慮すると、真のだと思いいる)どこからそれを解析した場合、あなたがしたいと思うように:

(write-catalog (transform-catalog (get-catalog "mycatalog.xml")))

すべてのメモリに食べないように巨大な中間シーケンス

それが役に立てば幸い。

+1

あなたは正しいです、私はこれに気づいたことを忘れました。私がよく理解していれば、定義されたvarがバインドされている限り、ガベージコレクタはseqを解放できません。私は今はあまり記憶を消費しない。ありがとう!! –

関連する問題