3

大きな FASTQ ファイルをランダムにサンプリングして、標準出力に書き込もうとしています。「GC オーバーヘッド制限を超えました」というエラーが何度も発生し、何が間違っているのかわかりません。leiningen で Xmx を増やしてみましたが、役に立ちませんでした。これが私のコードです:

(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)))
4

1 に答える 1

1

これは、無限シーケンスをマップやベクターなどの単純なデータ構造にマージしようとしたときによく発生する症状と同じです。これは多くの場合、メモリが不足していて、ガベージ コレクタが新しいオブジェクトの需要に対応できなかったことを意味します。ほとんどの場合、wtr エージェントがメモリに対して大きすぎます。おそらく、次のように変更して、出力結果をアトムに保存したくない場合があります。

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

(write [out msg] (.write out msg))
于 2013-10-01T17:04:16.353 に答える