当我运行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再懒了吗?
谢谢。
答案 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)))))