我的程序的map/zipmap部分是否会占用太多内存?
我的问题是,如果.csv文件足够大,map/zipmap步骤(下面)是否会消耗太多内存 我有一个从clojure csv返回的序列。为了清晰起见,特意将以下步骤分开。换句话说,我将在生产代码中结合其中一些我的程序的map/zipmap部分是否会占用太多内存?,map,clojure,sequence,lazy-evaluation,Map,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 i
; 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
s将保留延迟序列的头部。如果将它们替换为返回序列的函数,那么实际的头将只存在于调用堆栈中,并由延迟求值正确处理
(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
替换defs
是一个粗略的经验法则,虽然有时很有用,但可以让它们到处调用而不是读取(除非您真的想为多个读卡器提供惰性序列的缓存好处,并且该序列只能读取合理数量的数据)
在这里使用函数调用而不是读取def几乎肯定不会在热点编译器完成后对运行时产生任何影响。此代码泄漏内存的唯一方式是因为
def
s将保留惰性序列的头。如果用返回序列的函数替换它们,则实际头部将仅存在于调用堆栈中,并由延迟求值正确处理
(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
替换defs
是一个粗略的经验法则,虽然有时很有用,但可以让它们到处调用而不是读取(除非您真的想为多个读卡器提供惰性序列的缓存好处,并且该序列只能读取合理数量的数据)
在这里使用函数调用而不是读取DEF几乎肯定不会在hotspot编译器完成后对运行时产生任何影响。re:“我将在生产代码中结合其中一些功能。”hotspot编译器非常擅长内联,无需为了取悦JVMre而降低代码的美观性:“我会在生产代码中结合其中一些。"hotspot编译器非常擅长内联,不需要为了取悦JVM+1而让代码变得不那么漂亮。如果您只需要映射而不需要原始CSV数据,那么就不要保留传递给zipmap的惰性seq,一切都应该会很好。@Arthur Ulfeldt谢谢。我将替换def;它们只是为了演示目的。+1如果您只需要地图,而不需要原始CSV数据,然后不要保留传递给zipmap的惰性seq,一切都会好起来的。@Arthur Ulfeldt谢谢。我将替换def;它们只是为了演示。