with-open と clojure.java.io/reader を使用して txt ファイルからデータを解析する関数を作成し、データを処理するためにリーダー関数を複数回呼び出す別の関数を作成したとします。
(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 リーダーでファイルを 1 回だけ開き、必要なすべてのデータを 1 回で取得するのに十分スマートであるかということです。それとも、関数grabDataFromFileの呼び出し回数と同じ回数ファイルを開いたり閉じたりしますか? (この例では 3)
フォローアップの質問は、リーダーが十分に賢くない場合、および「パーサー」コードと「処理」コードを意図的に分離する必要がある場合、速度を上げるために何ができるでしょうか?