Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的程序的map/zipmap部分是否会占用太多内存?_Map_Clojure_Sequence_Lazy Evaluation - Fatal编程技术网

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

我的程序的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

我的问题是,如果.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
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;它们只是为了演示。