首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的程序的map/zipmap部分会占用太多内存吗?

我的程序的map/zipmap部分会占用太多内存吗?
EN

Stack Overflow用户
提问于 2012-08-10 00:48:18
回答 1查看 163关注 0票数 2

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

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

代码语言:javascript
复制
; 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)))

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-10 02:49:50

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

代码语言:javascript
复制
(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)))

这是一个粗略的经验法则,尽管有时很有用,但在它们包含无限序列时用defn替换defs,并使它们在任何地方都被调用,而不是读取(除非您真的想要多个读取器的惰性序列的缓存好处,并且序列只会有合理数量的数据读取)。

在这里使用函数调用而不是读取defs几乎肯定不会对运行时产生任何影响,一旦hotspot编译器使用完它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11888180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档