【发布时间】:2015-11-03 16:56:25
【问题描述】:
我有一个 txt 文件中的示例数据集。数据文件非常大,因此不能将其加载到内存中。我需要能够懒惰地读取文件。此外,我需要以随机顺序阅读这些行。在某些情况下,我不需要阅读所有行。这是我目前发现的 -
(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))))
返回文件的惰性序列。当我需要时,如何循环遍历惰性序列中的随机行?我认为在这里使用 go 块可能会有所帮助。 Go 块可以在通道中放置一条随机线并等待某些东西消耗它。一旦数据被读取,它就会在通道中放置另一行等待下一次读取。我该如何实施?
这是我的计算方法(不是随机的)-
(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))
这是解决问题的好方法吗?有更好的解决方案吗?我可能不需要阅读所有行,所以我希望能够在需要时关闭阅读器。
【问题讨论】:
-
所以,为了确保我正确理解您的问题:您需要对文件的每一行按顺序执行相同的操作,但该序列的顺序需要是随机的?
-
是的。这就是我想要做的。我添加了一个更新
标签: file asynchronous clojure lazy-sequences