当我在这个函数中运行一个 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再次变得不惰性?
谢谢你。