dictionary - 我的程序的map/zipmap部分会消耗太多内存吗?

标签 dictionary clojure sequence lazy-evaluation

我的问题是,如果 .csv 文件足够大,map/zipmap 步骤(如下)是否存在消耗过多内存的风险?

我有一个从 clojure-csv 返回的序列序列。为了清楚起见,以下步骤被故意分开。换句话说,我将在生产代码中组合其中一些。

; Process the .csv file
(defn fetch-csv-data
    "This function accepts a csv file name, and returns parsed csv data,
     or returns nil if file is not present."

    [csv-file]
        (let [csv-data (ret-csv-data csv-file)]
            csv-data))

(def bene-csv-inp  (fetch-csv-data "benetrak_roster.csv"))

; Pull out the columns/keys, and
(def bene-csv-cols (map #(cstr/trim %1) (first bene-csv-inp)))

; create the keys.
(def bene-csv-keys (map #(keyword %1) bene-csv-cols))

; Make a sequence of just one of the keys:

(def test-ssns2 (map (fn [x] (:GIC-ID x)) 
                (map #(zipmap gic-csv-keys %1) gic-csv-data)))

谢谢。

最佳答案

此代码泄漏内存的唯一方法是因为 def 将保留惰性序列的头部。如果将它们替换为返回序列的函数,那么实际的头将只存在于调用堆栈中,并通过惰性求值正确处理。

(defn bene-csv-inp [] (fetch-csv-data "benetrak_roster.csv"))

; Pull out the columns/keys, and
(defn bene-csv-cols [] (map #(cstr/trim %1) (first (bene-csv-inp))))

; create the keys.
(defn bene-csv-keys [] (map #(keyword %1) (bene-csv-cols)))

这是一个粗略的经验法则,尽管有时很有用,当 defs 包含无限序列时,用 defn 替换它们,并使它们在任何地方调用而不是读取(除非您确实希望为多个读取器提供惰性序列的缓存优势,并且该序列只会读取合理数量的数据)。

一旦热点编译器完成,使用函数调用而不是读取这里的定义几乎肯定不会对运行时产生任何影响。

关于dictionary - 我的程序的map/zipmap部分会消耗太多内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11888180/

相关文章:

vim - Racket xrepl 的内置帮助文本(非 html)文档

Python:为什么迭代时序列的 __len__() 被忽略?

javascript - 按顺序将类添加到项目列表

python - 如何在 Python 中过滤掉字典中的非字符串键?

flutter - 如何从目录导入所有 Dart 文件?

clojure - 常见的 lisp cons 从两个符号创建一个列表,clojure cons 需要一个 seq 到 cons 上?

ios - Swift 中的单行函数

python - 提取字典的子集后如何保持顺序?

Clojure Heroku Worker Dyno 队列