2013-10-01 1 views
3

Я пытаюсь случайным образом опробовать большой файл FASTQ и записать его в стандартную версию. Я продолжаю получать ошибки «превышения верхнего предела GC», и я не уверен, что я делаю неправильно. Я пробовал увеличивать Xmx в leiningen, но это не помогло. Вот мой код:Ошибка Clojure - превышен верхний предел GC

(ns fastq-sample.core 
    (:gen-class) 
    (:use clojure.java.io)) 

(def n-read-pair-lines 8) 

(defn sample? [sample-rate] 
    (> sample-rate (rand))) 

; 
; Agent for writing the reads asynchronously 
; 

(def wtr (agent (writer *out*))) 

(defn write-out [r] 
    (letfn [(write [out msg] (.write out msg) out)] 
    (send wtr write r))) 

(defn write-close [] 
    (send wtr #(.close %)) 
    (await wtr)) 

; 
; Main 
; 

(defn reads [file] 
    (->> 
    (input-stream file) 
    (java.util.zip.GZIPInputStream.) 
    (reader) 
    (line-seq))) 

(defn -main [fastq-file sample-rate-str] 
    (let [sample-rate (Float. sample-rate-str) 
     in-reads (partition n-read-pair-lines (reads fastq-file))] 
    (doseq [x (filter (fn [_] (sample? sample-rate)) in-reads)] 
     (write-out (clojure.string/join "\n" x))) 
    (write-close) 
    (shutdown-agents))) 

ответ

1

Это тот же симптом, я часто получаю, когда я пытаюсь объединить бесконечную последовательность в simgle структуру данных, таких как карты или вектор. Это очень часто означает, что память была жесткой, и сборщик мусора не мог справиться с спросом на новые объекты. Скорее всего, агент wtr слишком велик для памяти. Может быть, вы можете не сохранять распечатанные результаты в атоме путем изменения

(write [out msg] (.write out msg) out) 

в

(write [out msg] (.write out msg)) 
+0

Я думаю, что это будет работать только в первый раз, вывод записывается как состояние агента с изменением от результата до результата записи до функции * out *. Я написал код на основе этого - http://lethain.com/a-couple-of-clojure-agent-examples/ –