gpt4 book ai didi

file-io - Clojure读取大文件并转换其中数据的方式

转载 作者:行者123 更新时间:2023-12-01 10:54:37 25 4
gpt4 key购买 nike

我正在处理一个非常大的 Subrip 字幕文件,需要一次处理一个字幕。在 Java 中,要从文件中提取字幕,我会编写一个具有以下签名的方法:

Iterator<Subtitle> fromSubrip(final Iterator<String> lines);

使用 Iterator 给我两个好处:

  1. 文件永远不会完整地存在于内存中,也不会包含其任何转换阶段。
  2. 一种抽象,其中我可以循环遍历 Subtitle 对象的集合,而不会产生内存开销。

由于迭代器本质上是命令式和可变的,因此它们在 Clojure 中可能不是惯用的。那么 Clojure 有什么方法来处理这种情况呢?

最佳答案

正如 Vladimir 所说,您需要正确处理懒惰和文件关闭。这是我的做法,如“Read a very large text file into a list in clojure”所示:

(defn lazy-file-lines 
"open a (probably large) file and make it a available as a lazy seq of lines"
[filename]
(letfn [(helper [rdr]
(lazy-seq
(if-let [line (.readLine rdr)]
(cons line (helper rdr))
(do (.close rdr) nil))))]
(helper (clojure.java.io/reader filename))))

关于file-io - Clojure读取大文件并转换其中数据的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15996035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com