File io 是clojure';s的读取文件结构,即具有open和clojure.java.io/reader,是否足够高效以便频繁访问?

File io 是clojure';s的读取文件结构,即具有open和clojure.java.io/reader,是否足够高效以便频繁访问?,file-io,clojure,bufferedreader,streamreader,File Io,Clojure,Bufferedreader,Streamreader,假设我写了一个函数来解析txt文件中的数据,然后我写了另一个函数来多次调用reader函数来处理数据,例如 (defn grabDataFromFile [file patternString] (let [data (atom [])] (with-open [rdr (clojure.java.io/reader file)] (doseq [line (line-seq rdr)] (if (re-matches

假设我写了一个函数来解析txt文件中的数据,然后我写了另一个函数来多次调用reader函数来处理数据,例如

(defn grabDataFromFile [file patternString]   
     (let [data (atom [])]
        (with-open [rdr (clojure.java.io/reader file)] 
         (doseq [line (line-seq rdr)] 
           (if  (re-matches  (re-pattern  patternString) line) (swap! data conj line))))
        @data))


(defn myCalculation [file ]
  (let [data1 (grabDataFromFile file "pattern1")
        data2 (grabDataFromFile file "pattern2")
        data3 (grabDataFromFile file "pattern3")]
    ;calculations or processes of data1, data2, data3....))
我的问题是,在这个myCalculation函数中,底层代码是否足够聪明,可以使用clojure reader只打开一次文件,并一次性获得所需的所有数据?或者它打开和关闭文件的次数是函数grabDataFromFile调用次数的两倍?(本例中为3)


接下来的一个问题是,如果读卡器不够智能,并且如果我必须故意将“解析器”代码与“处理”代码分开,我可以做些什么来加快速度?

grabDataFromFile
将在每次调用读卡器时打开和关闭它(在退出时)。底层代码不能如此智能,以至于函数可以在没有明确提供信息的情况下检测其调用方的上下文

使
grabDataFromFile
接受另一个函数,该函数是在每一行上运行的解析器逻辑(也可以是要在每一行上执行的任何函数)

(defn grabDataFromFile [file patternString process-fn]   
  (with-open [rdr (clojure.java.io/reader file)] 
    (doseq [line (line-seq rdr)] 
      (process-fn line))))




(defn myCalculation [file]
  (let [patterns [["pattern1" (atom [])]
                  ["pattern2" (atom [])]
                  ["pattern3" (atom [])]]
        pattern-fns (map (fn [[p data]]
                           (fn [line]
                             (if  (re-matches (re-pattern  p) line)                              
                               (swap! data conj line)))) patterns)
        pattern-fn (apply juxt pattern-fns)]
    (grabDataFromFile file pattern-fn)
    ;perform calc on patterns atoms
    ))