当我将 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循环中
我的序列回到向量中,而没有意识到内存中的整个序列,这就是使惰性序列再次变得不惰性?
谢谢。
1)我希望使序列懒惰无济于事,因为打印将在打印之前评估实现它。相反尝试doseq
or (map print my-seq)
将其打印成较小的块。
2)是的,将它包装在 vec 中会给你你想要的:)虽然用一个包装你的reduceinto
会一直保持它是一个向量。 IE:(reduce into [] [[1] [2] [3]] )
--> [1 2 3]
(into out-log (sorted-map cmp-val (vector lnam fnam)))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)