- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想解析一个大的 json 文件 (3GB) 并返回该文件中每一行的 HashMap 。我的直觉是使用转换器逐行处理文件,并用一些选定的字段(> 文件中字节的 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就地处理文件。
此外,我需要根据文件格式更改解析器和转换器。
谢谢!
最佳答案
你已经很接近了。我不知道 json/parse-string
的作用,但它是否与 here 中的 json/read-str
相同那么这段代码应该就是你想要做的事情。
看起来你想要这样的东西:
(require '[clojure.data.json :as json])
(require '[clojure.java.io :as java])
(defn load-with!
"Load a file using a parser, a structure and a transducer."
[parser structure xform path]
(with-open [r (java/reader path)]
(into structure (xform (parser r)))))
(def xf (partial map #(get-in % ["experiments" "results"])))
(def parser (comp (partial map json/read-str) line-seq))
(load-with! parser [] xf "file.json")
我猜这些只是将所有业务细节删除到这里的最小示例中所犯的错误。使用下面的代码我能够处理一个大文件,上面的代码给了我一个 OOM 错误:
(require '[clojure.data.json :as json])
(require '[clojure.java.io :as java])
(def structure (atom []))
(defn do-it! [xform path]
(with-open [r (java/reader path)]
(doseq [line (line-seq r)]
(swap! structure conj (xform line)))))
(defn xf [line]
(-> (json/read-str line)
(get-in ["experiments" "results"])))
(do-it! xf "file.json")
(take 10 @structure)
关于clojure - 使用 Clojure Transducers 解析大文件 : OutOfMemory Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40193129/
Paul Chiusano和 Rúnar Óli写了一本很棒的书 Functional programming in Scala .他们在其中提到了 Scala 社区中一个很少被引用的概念 - Tra
关于如何使用 transduce 的任何想法来自 Ramda.js,使其无需对数据进行中间转换((2x 过滤,1x 排序))进行优化。 import { curry, tap, pipe, filte
我已经尝试阅读此内容,但我仍然不明白它们的值(value)或它们取代的内容。它们会让我的代码更短、更容易理解吗? 更新 很多人都发布了答案,但很高兴看到有和没有传感器的例子,这些例子非常简单,即使是像
我试图了解 RNN Transducer 如何使用地面实况标签进行训练。就 CTC 而言,我知道该模型是使用损失函数进行训练的,该函数总结了地面真实标签所有可能对齐的所有分数。 但在 RNN-T 中,
我想解析一个大的 json 文件 (3GB) 并返回该文件中每一行的 HashMap 。我的直觉是使用转换器逐行处理文件,并用一些选定的字段(> 文件中字节的 5%)构造一个向量。 但是,以下代码会抛
RxJS v4 曾经有一个 Observable.transduce采用换能器的方法。这允许使用在过去具有重大性能优势的独立于库的传感器运算符。 来源 https://github.com/React
我正在使用两个优秀的库:js-csp和 transducers.js试图围绕它们(和发电机)。 我认为我对使用 channel 有很好的理解,但是当我决定对它们应用传感器(我还不太了解)时,我似乎无法
我正在尝试练习在 swift 中编写转换器,但我无法成功地将此功能性 javascript 代码转换为 swift。 http://phuu.net/2014/08/31/csp-and-transd
我正在努力了解 Clojure 中用于并行计算的所有不同抽象。在阅读主题时,我会迷失在冗长文章的所有细节中。 我正在寻找一个简短的答案 为什么我们需要不同的图书馆和 何时使用和何时不使用特定库。 到目
我是一名优秀的程序员,十分优秀!