clojure.java.jdbc/延迟查询大结果集

2023-11-26

我正在尝试从数据库读取数百万行并写入文本文件。

这是我的问题的延续数据库转储到文本文件有副作用

我现在的问题似乎是在程序完成之前不会发生日志记录。我没有懒惰处理的另一个指标是,在程序完成之前根本不会写入文本文件。

根据 IRC 提示,我的问题可能与:result-set-fn并默认为doall in the clojure.java.jdbc/query代码区域。

我尝试用一​​个替换它for函数,但仍然发现内存消耗很高,因为它将整个结果集拉入内存。

我怎样才能拥有一个:result-set-fn这并不像把所有东西都拉进去doall?如何在程序运行时逐步写入日志文件,而不是在程序运行后转储所有内容-main执行完毕?

    (let [ 
          db-spec              local-postgres
          sql                  "select * from public.f_5500_sf "
          log-report-interval  1000
          fetch-size           100
          field-delim          "\t"                                                                  
          row-delim            "\n"                                                                  
          db-connection        (doto ( j/get-connection db-spec) (.setAutoCommit false)) 
          statement            (j/prepare-statement db-connection sql :fetch-size fetch-size ) 
          joiner               (fn [v] (str (join field-delim v ) row-delim ) )                      
          start                (System/currentTimeMillis)                                            
          rate-calc            (fn [r] (float (/ r (/ ( - (System/currentTimeMillis) start) 100))))  
          row-count            (atom 0)                                                              
          result-set-fn        (fn [rs] (lazy-seq rs))
          lazy-results         (rest (j/query db-connection [statement] :as-arrays? true :row-fn joiner :result-set-fn result-set-fn)) 
          ]; }}}
      (.setAutoCommit db-connection false)
      (info "Started dbdump session...")    
      (with-open [^java.io.Writer wrtr (io/writer "output.txt")]
        (info "Running query...")    
        (doseq [row lazy-results] 
          (.write wrtr row)
          ))  
        (info (format "Completed write with %d rows"   @row-count))
      )

我采取了最近的修复clojure.java.jdbc通过把[org.clojure/java.jdbc "0.3.0-beta1"]在我的 project.clj 依赖项列表中。这增强/纠正了:as-arrays? true的功能clojure.java.jdbc/query描述here.

我认为这有所帮助,但是我仍然可以覆盖:result-set-fn to vec.

通过将所有行逻辑塞进中解决了核心问题:row-fn。最初的 OutOfMemory 问题与迭代有关j/query结果集而不是定义具体的:row-fn.

新的(工作)代码如下:

(defn -main []
  (let [; {{{
        db-spec              local-postgres
        source-sql           "select * from public.f_5500 "
        log-report-interval  1000
        fetch-size           1000
        row-count            (atom 0)
        field-delim          "\u0001"   ; unlikely to be in source feed,
                                        ; although i should still check in
                                        ; replace-newline below (for when "\t"
                                        ; is used especially) 
        row-delim            "\n" ; unless fixed-width, target doesn't
                                  ; support non-printable chars for recDelim like 
        db-connection        (doto ( j/get-connection db-spec) (.setAutoCommit false))
        statement            (j/prepare-statement db-connection source-sql :fetch-size fetch-size :concurrency :read-only)
        start                (System/currentTimeMillis)
        rate-calc            (fn [r] (float (/ r (/ ( - (System/currentTimeMillis) start) 100))))
        replace-newline      (fn [s] (if (string? s) (clojure.string/replace  s #"\n" " ") s))
        row-fn               (fn [v] 
                               (swap! row-count inc)
                               (when (zero? (mod @row-count log-report-interval))
                                 (info (format "wrote %d rows" @row-count))
                                 (info (format "\trows/s %.2f"  (rate-calc @row-count)))
                                 (info (format "\tPercent Mem used %s "  (memory-percent-used))))
                               (str (join field-delim (doall (map #(replace-newline %) v))) row-delim ))
        ]; }}}
    (info "Started database table dump session...")
    (with-open [^java.io.Writer wrtr (io/writer "./sql/output.txt")]
      (j/query db-connection [statement] :as-arrays? true :row-fn 
               #(.write wrtr (row-fn %))))
    (info (format "\t\t\tCompleted with %d rows" @row-count))
    (info (format "\t\t\tCompleted in %s seconds" (float (/ (- (System/currentTimeMillis) start) 1000))))
    (info (format "\t\t\tAverage rows/s %.2f"  (rate-calc @row-count)))
    nil)
  )

我尝试过的其他事情(取得了有限的成功)包括音色记录和关闭标准输出;我想知道使用 REPL 是否可以在显示回我的编辑器(vimfirewall)之前缓存结果,并且我不确定这是否占用了大量内存。

另外,我在内存空闲周围添加了日志记录部分(.freeMemory (java.lang.Runtime/getRuntime))。我对 VisualVM 不太熟悉,也不太清楚我的问题出在哪里。

我对现在的工作方式感到满意,感谢大家的帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

clojure.java.jdbc/延迟查询大结果集 的相关文章

  • Java 8 升级后无法获取数据库连接

    我最近将一个应用程序从 java 1 7 升级到 1 8 其余库版本保持不变 升级后我收到以下错误 DEBUG 2015 11 12 09 55 12 BasicResourcePool An exception occurred whil
  • 如何在 Clojure 中更新原子的向量元素?

    我有一个矢量原子 我想更新一个本身就是地图的条目 def vector atom atom swap vector atom conj id 1 name myname 我该如何只更新该成员 在可变的 Java 领域的思维方式中 我会做这样
  • 如何在flyway创建的postgresql jdbc连接上设置时区?

    我有一个 postgresql 数据库 我使用 Flyway 将脚本部署到该数据库 我使用 Maven Flyway 插件启动针对目标数据库的数据库构建 在该构建中 我有一些脚本可以执行以下操作 create table my table
  • java与maven和eclipse中的clojure混合

    我创建了一个示例多语言程序 我有一个用java实现的传感器和一个机器人 以及用clojure实现的AI 我无法正确连接maven src main java clojuretest DistanceSensor java AI clj us
  • 为什么“(def 元音?(set“aeiou”))”有效?

    我正在看优秀的 Clojure 教程here http ociweb com jnb jnbMar2009 html 在其中一个示例中 它具有如下所示的 Clojure 代码 def vowel set aeiou 这使得元音对于元音返回
  • 好的 Clojure 代码示例? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在第一次查看 Clojure 我发现查看 Clojure 核心库的 doc xxx 和 sourc
  • 在准备好的语句中设置数组,抛出 java.sql.SQLFeatureNotSupportedException

    我有一个字符串列表 我想将其设置为准备好的语句中的参数 这里的问题和答案看起来很简单 如何使用数组列表作为准备好的语句参数 https stackoverflow com questions 17842211 how to use an a
  • 从命令行将 clojure 源代码编译为类(AOT)(不使用 lein)

    我正在尝试将 clojure 源代码编译成类文件 并仅使用命令行运行它 没有 lein 也没有 可能 回复 我有 core cljsrc hello目录 src hello core clj 这是源代码 ns hello core defn
  • 在 Clojure 中递归反转序列

    我想在 Clojure 中反转序列而不使用reverse函数 并递归地执行此操作 这是我想出的 defn reverse recursively coll loop r rest coll acc conj first coll if co
  • 从 JVM 线程本地空间卸载 Clojure 变量

    我正在 Clojure 中为 BaseX 编写一个插件 通过 lein uberjar 构建 并包含 Clojure 解释器 在大多数情况下 这效果很好 然而 当通过 BaseX HTTP 实例运行时 评估在 Jetty 的线程池内进行 而
  • getArray 上的 SQLFeatureNotSupportedException

    使用 MySQL 5 5 STS 2 9 2 mysql connector java 5 1 21 bin jar 我想从 ResultSet 中获取一个数组 所以我这样编码 try Connection conn DriverManag
  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以
  • Leiningen 中的本地依赖项无需创建 Maven 存储库?

    我正在构建一个 Compojure Web 应用程序 我希望它使用我编写的另一个 Clojure 项目中的函数 我对 Maven 一点也不熟悉 据我所知 它的学习曲线非常陡峭 很遗憾 一切 https stackoverflow com q
  • 无法在 JDBCPreparedStatement 中使用 LIKE 查询吗?

    查询代码及查询方式 ps conn prepareStatement select instance id from eam measurement where resource id in select RESOURCE ID from
  • Postgresql JDBC 驱动程序中的批量更新在自动提交中回滚

    我正在使用 postgres 9 3 1100 jdbc41 JDBC4 驱动程序进行批量插入 根据 JDBC 规范 其可达 到应用程序以禁用自动提交并提交或 回滚事务 就我而言 我没有使用任何事务 即自动提交为真 但如果批次中的其中一个插
  • 在 JDBC PL/SQL 块中多次使用命名参数时出错

    当使用命名参数调用 PL SQL 块时出现错误 当所有命名参数仅使用一次时 我的代码工作正常 但是当我复制标有 SQL 的 SQL 时 然后所有命名参数 以冒号开头 q 都使用了两次 现在我得到一个 SQL 异常 它说 参数名称的数量与注册
  • 当键是复合键时,metaData.getPrimaryKeys() 返回单行

    我在使用 SQLite 驱动程序的 JDBC 中遇到复合主键问题 The getPrimaryKeys 方法从DatabaseMetaData当我验证该键实际上是由两列组成的复合键时 对象返回单行 有人对如何检索主键的真实列表有任何建议 替
  • 将向量作为绑定传递给 for 宏时出现问题

    我有任意数量的列表 我想使用 for 宏来处理它们 我想创建一个传递向量作为绑定的函数 因为列表的数量各不相同 如果我对绑定进行硬编码 它会按我的预期工作 gt def list1 pink green gt def list2 dog c
  • Clojure Web 应用程序 - 我从哪里开始?

    最近我一直在研究 Clojure 我喜欢这门语言 我想看看我是否可以在其中制作一个小型网络应用程序 只是为了挑战自己 但是 我完全没有设置任何与 Java 相关的 Web 应用程序的经验 事实上 我对 Java 并没有太多的经验 我从哪说起
  • Clojure读行函数问题

    我试图在我的 Clojure 程序中获取控制台输入 但是当它到达程序的该部分时它给我这个错误 Exception in thread main java lang ClassCastException clojure lang LineNu

随机推荐

  • 从 URL 中删除锚点 (#hash)

    PHP 中有没有可靠的方法来清除 URL 中的锚标记 所以输入 http site com some anchor Outputs http site com some 使用 strstr url strstr url true 使用 st
  • Python 致命错误:无法获取随机数来初始化 Python

    Python 致命错误 无法获取随机数来初始化 Python 环境 Windows 10 VSC 15 使用 CreateProcessA winapi 并传递 lpenvironment 变量来使用脚本运行 python 当 lpenvi
  • 无法克隆对象

    这是针对 TF 2 0 的 请在下面找到我的代码 该代码使用以下命令执行 GridSearch 和交叉验证sklearn model selection GridSearchCV对于运行完美的 mnist 数据集 Build Functio
  • 当方向改变时,将图像在同一位置旋转 90 度

    最终这样做了 支持多个方向的最简单方法 当应用程序处于横向模式时 如何加载自定义 NIB 效果棒极了 我在 Photoshop 中制作了一张图像 想将其用作 iPad 应用程序中信息屏幕的背景 该图像还包含文本和一些图标 图像周围有一个绿色
  • jinja2 嵌套变量

    我目前正在学习 jinja2 我不确定如何以正确的方式寻址变量 这是我在 yaml 中的变量 hosts app201 acme com eth0 ip 46 0 0 1 netmask 255 255 255 255 graphite a
  • 如何用javascript显示数据列表?

    嘿 我想在单击按钮时显示特定输入的数据列表 但我找不到如何操作 HTML
  • 切片集合的 Python 方式是什么?

    我有一些数据列表 例如 some data 1 2 4 1 6 23 3 56 6 2 3 5 6 32 2 12 5 3 2 我想获得具有固定长度的唯一值 我不关心我会得到哪个 并且我也希望它成为set 我知道我能做到set from s
  • 跨多个脚本定义公共变量?

    我有许多 Bash 和 Perl 脚本 它们在功能上不相关 但相关之处在于它们在同一项目中工作 它们在同一个项目中工作的事实意味着我通常在每个脚本的顶部指定相同的目录 相同的项目特定命令 相同的关键字 目前 这并没有让我感到困扰 但我知道将
  • LINQ 表达式返回属性值?

    我正在尝试创建一个通用函数来帮助我使用 LINQ to SQL 从本地列表中选择数千条记录 SQL Server 至少 2005 将查询限制为 2100 个参数 我想选择比这更多的记录 这是一个很好的用法示例 var some produc
  • WordPress 表单操作提交

    在 WordPress 中有一个自己定制的表单 action send form php 提交时 它总是转到send form php 但是这个 php 用于发送信息 我无法使用主题进行样式设置 有没有办法在发送信息并打印出来并在字段中显示
  • 如何使RequiredAttribute与枚举字段一起使用

    我最近意识到 requiredAttribute 不适用于枚举字段 假设我在表单上有两个名为 ddlOfficers 和 ddlApplicationTypes 的选择元素 这两个元素都是在 HtmlHelper 方法的帮助下呈现的 创建d
  • Swift:将参数传递给选择器

    使用 Swift 3 Xcode 8 2 1 Method func moveToNextTextField tag Int print tag 下面的行编译得很好 但是tag有一个未初始化的值 let selector selector
  • C# 中的 Windows 版本 [重复]

    这个问题在这里已经有答案了 我想知道 PC 的 Windows 版本 在 C Framework 3 5 中 我尝试过使用 操作系统 os 环境 OSVersion 版本 ver os Version 但结果是 平台 WIN32NT 版本6
  • 四元数旋转不起作用

    在适用于 Android 的 OpenGL ES 1 中 我有一个由 27 个较小的立方体组成的 Rubic 立方体 我想要旋转 导致特定的小立方体恰好位于视点前面 所以我需要两个向量 一个是从对象原点到特定立方体的向量 另一个是从原点到视
  • 如何对hmatrix进行自动微分?

    Sooooo 事实证明从假矩阵 to hmatrix事实证明数据类型并不平凡 序言供参考 LANGUAGE RankNTypes LANGUAGE ParallelListComp LANGUAGE ScopedTypeVariables
  • 如何在 PHP 中重写 register_argc_argv ?

    我正在使用共享主机 fasthostingdirect 并且出于某种原因 他们默认关闭此标志 这意味着我无法访问 PHP 命令行参数 除非我使用 n no php info 之后标记php exe 试过ini set register ar
  • 在 matplotlib 中使用 3D 数据生成热图

    我有一个函数returnValuesAtTime返回三个列表 x vals y vals and swe vals 所有三个列表的长度相同 并且每个元素swe vals对应于一个x value from x vals and a y val
  • 如何获取当前所有正在运行的任务

    我想获取在 android 中运行的所有任务 我在 ActivityManager 中找到了 getRunningTasks 但从 android 5 0 开始 getRunningTasks 可能不会提供所有任务 在我的情况下 它提供主屏
  • 重写 Javascript 中的等价比较

    是否可以重写 Javascript 中的等价比较 我得到的最接近的解决方案是定义 valueOf 函数并在对象前面加上加号来调用 valueOf 这有效 equal x y true 但这失败了 equal x y true why doe
  • clojure.java.jdbc/延迟查询大结果集

    我正在尝试从数据库读取数百万行并写入文本文件 这是我的问题的延续数据库转储到文本文件有副作用 我现在的问题似乎是在程序完成之前不会发生日志记录 我没有懒惰处理的另一个指标是 在程序完成之前根本不会写入文本文件 根据 IRC 提示 我的问题可