我想解析一个大的 json 文件(3GB)并为这个文件中的每一行返回一个哈希映射。我的直觉是使用传感器逐行处理文件并构造一个带有一些选定字段的向量(> 文件中的 5% 字节)。
但是,以下代码会引发 OutOfMemory 异常:
文件.json
{"experiments": {"results": ...}}
{"experiments": {"results": ...}}
{"experiments": {"results": ...}}
解析器.clj
(defn load-with!
"Load a file using a parser, a structure and a transducer."
[parser structure xform path]
(with-open [r (clojure.java.io/reader path)]
(into structure xform (parser r))))
(def xf (map #(get-in % ["experiments" "results"])))
(def parser (comp (partial map cheshire.core/parse-string) line-seq))
(load-with! parser (vector) xf "file.json")
当我使用 JVisualVM 可视化进程时,堆会随着时间的推移而增长,并在进程崩溃之前超过 25 GB。
在这种情况下传感器是否合适?有更好的选择吗?
我的要求之一是在函数末尾返回新结构。因此,我不能使用 doseq 就地处理文件。
此外,我需要根据文件格式更改解析器和转换器。
谢谢 !