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

所以我的问题是:

1)是否应该在lazy-seq中包装对这个函数的调用来解决我的问题?

2)我不想要一个列表,所以将lazy-seq调用包装在vec中会将我的序列转回一个向量,而不会在内存中实现整个序列,也就是说让lazy-seq再次变得不惰性?

谢谢你。

4

1 回答 1

3

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

2) 是的,将它包装在 vec 中会给你你想要的:) 虽然用 an 包装你的 reduceinto会一直让它保持一个向量。即:(reduce into [] [[1] [2] [3]] )-->[1 2 3]

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