Clojure—加快大文件处理速度
我需要读取大文件(~1GB),处理它并保存到db。我的解决方案如下所示: data.txt 格式:Clojure—加快大文件处理速度,clojure,large-files,Clojure,Large Files,我需要读取大文件(~1GB),处理它并保存到db。我的解决方案如下所示: data.txt 格式:[id],[title]\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 #",")] (zip
[id],[title]\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条解析行->批量将它们插入数据库->重复,直到没有行。不幸的是,我不知道如何实现这一点。一个建议:
- 用于获取延迟的行序列
- 使用map解析每一行
(到目前为止,这与您正在做的事情相匹配)
- 用于将惰性的解析行序列划分为批,然后
- 使用insert batch with将每个批写入数据库
举个例子:
(->> (line-seq reader)
(map parse-line)
(partition-all 1000)
(#(doseq [batch %]
(insert-batch batch))))
很好!非常感谢你。我发现我在理解惰性序列时遇到了问题。你知道有什么好的资源可以帮助我更好地理解它吗?如果你想并行处理分区呢?任何pmap
等效于doseq
或其他推荐的用于管理作为执行者的一组代理的习惯用法?从clojure 1.7开始,您可以使用简单(运行!插入批处理)替换最后一部分。也应该是插入批量!当它修改状态时(以db为单位)。