3

221行の.csvファイル(clojure-csvで解析)をこの関数に実行すると

(defn test-key-inclusion
    "Accepts csv-data param and an index, a second csv-data param and an index,
     and searches the second csv-data instances' rows (at index) to see if
     the first file's data is located in the second csv-data instance."

    [csv-data1 pkey-idx1 csv-data2 pkey-idx2 lnam-idx fnam-idx]

    (reduce
        (fn [out-log csv-row1]
            (let [cmp-val (nth csv-row1 pkey-idx1 nil)
                  lnam (nth csv-row1 lnam-idx nil)
                  fnam (nth csv-row1 fnam-idx)
                  temp-rc (first (key-pres? cmp-val pkey-idx2 csv-data2))]

            (concat out-log (sorted-map cmp-val (vector lnam fnam)))))
         {}
         csv-data1))

結果を印刷すると、すべて問題ありません。

2672行の.csvファイル(これもclojure-csvで解析されます)を上記の関数で実行してから印刷しようとすると、スタックオーバーフローエラーが発生します-スレッド「メイン」の例外java.lang.StackOverflowError

だから私の質問は:

1)lazy-seq内でこの関数の呼び出しをラップすると、問題が解決するはずですか?

2)リストが必要ないので、lavy-seq呼び出しをve​​c内でラップすると、メモリ内のシーケンス全体を認識せずにシーケンスがベクトルに戻ります。つまり、lazy-seqが再びレイジーではなくなりますか?

ありがとうございました。

4

1 に答える 1

3

1)印刷する前に印刷が評価されるため、シーケンスを怠惰にすることは役に立たないことを期待しています。代わりに、それを小さなチャンクで印刷してみてdoseqください。(map print my-seq)

2)はい、vecでラップすると、必要なものが得られます:)ただし、reduceをanでラップすると、into常にベクターが保持されます。すなわち: (reduce into [] [[1] [2] [3]] )-->[1 2 3]

  (into out-log (sorted-map cmp-val (vector lnam fnam)))))
于 2012-04-12T22:19:21.430 に答える