如何将一个减少实现的序列转换回惰性向量序列

时间:2012-04-12 22:06:14

标签: clojure

当我运行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解析 - 通过上面的函数然后尝试打印它,我得到一个堆栈溢出错误 - 线程“main”java.lang中的异常.StackOverflowError

所以我的问题是:

1)在lazy-seq中包含对此函数的调用是否可以解决我的问题?

2)我不想要一个列表,所以将lazy-seq调用包含在vec转向中 我的序列回到了一个向量而没有意识到内存中的整个序列,那就是让lazy-seq再懒了吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

1)我希望让序列变得懒惰不会有帮助,因为print会在打印之前评估实现它。而是尝试doseq(map print my-seq)以较小的块打印它。

2)是的,将它包装在vec中会给你你想要的东西:)尽管用into包裹你的缩小会使它一直保持向量。即:(reduce into [] [[1] [2] [3]] ) - > [1 2 3]

  (into out-log (sorted-map cmp-val (vector lnam fnam)))))