我需要读取一个大文件(~1GB),处理它并保存到数据库。我的解决方案如下:
data.txt
格式:
[id],[标题]\n
1,Foo
2,Bar
...
代码
(ns test.core
(:require [clojure.java.io :as io]
[clojure.string :refer [split]]))
(defn parse-line
[line]
(let [values (split line #",")]
(zipmap [:id :title] values)))
(defn run
[]
(with-open [reader (io/reader "~/data.txt")]
(insert-batch (map parse-line (line-seq reader)))))
; insert-batch just save vector of records into database
但是这段代码运行效果不佳,因为它首先解析所有行,然后再将它们发送到数据库。
我认为理想的解决方案应该是 读取一行 -> 解析一行 -> 收集1000个解析好的行 -> 批量插入到数据库中 -> 重复此过程直到没有可插入的行
。不幸的是,我不知道如何实现这个方案。
doseq
的pmap
等效函数或其他推荐的习惯用语来管理一堆代理作为执行器? - matanster