我在txt文件中设置了一个示例数据集。数据文件非常大,因此不能将其加载到内存中。我需要能够懒散地阅读文件。此外,我需要以随机顺序读取这些行。而且有些情况下我不需要阅读所有的文字。这是我到目前为止发现的 -Clojure懒洋洋地从文件中读取随机行
(defn read-lazy [in-file]
(letfn [(helper [rdr]
(if-let [line (.readLine rdr)]
(cons line (helper rdr))
(do (.close rdr) nil)))]
(helper (io/reader in-file))))
它返回文件的lazy-seq。当我需要时,如何在lazy-seq中随机循环循环?我认为使用go block可以在这里帮助。去块可以在通道中放置一条随机线,等待某些东西消耗掉它。一旦数据被读取,它会在通道中放入另一条线等待下一次读取。我怎样才能实现呢?
以下是我已经工作了(不是随机的) -
(def lazy-ch (chan))
(defn async-fetch-set [in-file]
(go
(with-open [reader (io/reader in-file)]
(doseq [line (line-seq reader)]
(>! lazy-ch line)))
(close! lazy-ch)))
(println "got: " (<!! lazy-ch))
这是解决这个问题的好办法?有更好的解决方案吗?我可能不需要阅读所有内容,所以我希望能够在需要时关闭阅读器。
所以,以确保我正确地理解你的问题:你需要在序列中的文件的每一行执行相同的操作,但该序列顺序的问题随机? –
是。这就是我想要做的。我添加了更新 – Lordking