Clojure—加快大文件处理速度

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

我需要读取大文件(~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 #",")]
    (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为单位)。