使用 R 优化/向量化数据库查询

2024-03-04

我正在尝试使用 R 查询大型数据库。由于数据库的大小,我编写了一次获取 100 行的查询,我的代码如下所示:

library(RJDBC)
library(DBI)
library(tidyverse)

options(java.parameters = "-Xmx8000m")

drv<-JDBC("driver name", "driver path.jar")

conn<-
  dbConnect(
    drv, 
    "database info",
    "username",
    "password"
)

query<-"SELECT * FROM some_table"

hc<-tibble()
res<-dbSendQuery(conn,query)
repeat{
  chunk<-dbFetch(res,100)
  if(nrow(chunk)==0){break}
  hc<-bind_rows(hc,chunk)
  print(nrow(hc))
}

基本上,我想写一些做同样事情的东西,但是通过组合function and lapply。理论上,考虑到 R 通过循环处理数据的方式,使用lapply会加快查询速度。一些理解dbFetch功能可能会有所帮助。具体来说,如何在repeat循环它不只是继续选择前 100 行。

我已尝试以下方法,但没有任何效果:

df_list <- lapply(query , function(x) dbGetQuery(conn, x)) 

hc<-tibble()
res<-dbSendQuery(conn,query)
test_query<-function(x){
  chunk<-dbFetch(res,100)
  if(nrow(chunk)==0){break}
  print(nrow(hc))
}
bind_rows(lapply(test_query,res))

考虑遵循中的示例dbFetch 文档 https://www.rdocumentation.org/packages/DBI/versions/0.5-1/topics/dbFetch检查提取的完成状态,dbHasCompleted。然后,为了提高内存效率,构建一个数据帧/标题列表lapply然后行绑定once循环之外。

rs <- dbSendQuery(con, "SELECT * FROM some_table")

run_chunks <- function(i, res) {
  # base::transform OR dplyr::mutate
  # base::tryCatch => for empty chunks depending on chunk number
  chunk <- tryCatch(transform(dbFetch(res, 100), chunk_no = i),    
                    error = function(e) NULL)
  return(chunk)
}

while (!dbHasCompleted(rs)) {
  # PROVIDE SUFFICIENT NUMBER OF CHUNKS (table rows / fetch rows)
  df_list <- lapply(1:5, run_chunks, res=rs)                      
}

# base::do.call(rbind, ...) OR dplyr::bind_rows(...) 
final_df <- do.call(rbind, df_list)

内存 SQLite 数据库演示mtcars:

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbWriteTable(con, "mtcars", mtcars)

run_chunks <- function(i, res) {
  chunk <- dbFetch(res, 10)
  return(chunk)
}

rs <- dbSendQuery(con, "SELECT * FROM mtcars")

while (!dbHasCompleted(rs)) {
  # PROVIDE SUFFICIENT NUMBER OF CHUNKS (table rows / fetch rows)

  df_list <- lapply(1:5, function(i) 
    print(run_chunks(i, res=rs))
  )
}

do.call(rbind, df_list)

dbClearResult(rs)
dbDisconnect(con)

Output (5块10行、10行、10行、2行、0行和满32行)

#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
# 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
# 9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
# 10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4

#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
# 2  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
# 3  17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
# 4  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
# 5  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
# 6  10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
# 7  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
# 8  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
# 9  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
# 10 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1

#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
# 2  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
# 3  15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
# 4  13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
# 5  19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
# 6  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
# 7  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
# 8  30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
# 9  15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
# 10 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

#    mpg cyl disp  hp drat   wt qsec vs am gear carb
# 1 15.0   8  301 335 3.54 3.57 14.6  0  1    5    8
# 2 21.4   4  121 109 4.11 2.78 18.6  1  1    4    2

# [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
# <0 rows> (or 0-length row.names)

do.call(rbind, df_list)
#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
# 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
# 9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
# 10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
# 11 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
# 12 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
# 13 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
# 14 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
# 15 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
# 16 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
# 17 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
# 18 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
# 19 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
# 20 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
# 21 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
# 22 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
# 23 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
# 24 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
# 25 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
# 26 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
# 27 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
# 28 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
# 29 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
# 30 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
# 31 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
# 32 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 R 优化/向量化数据库查询 的相关文章

  • 如何使用 Rrank() 函数创建新的ties.method? [复制]

    这个问题在这里已经有答案了 我试图按人口和日期排序这个数据框 所以我使用order and rank 功能 gt df lt data frame idgeoville c 5 8 4 3 4 5 8 8 date c rep 1950 4
  • 如何从另一个数组值中过滤数组值并返回新数组? [复制]

    这个问题在这里已经有答案了 我有两个数组 all languages and taken languages 第一个包含所有语言 例如 200 种或其他语言 第二个包含之前选择的语言 从 0 到 200 种 我需要删除所有已采用的语言 ta
  • 在循环中调用 setTimeout 未按预期工作

    下面的 JavaScript 应该 在我看来 以 0 5 秒的间隔播放一系列音符 但它会将它们全部作为一个同时的和弦来演奏 知道如何修复它吗 function playRecording if notes length gt 0 for v
  • 了解日期并使用 R 中的 ggplot2 绘制直方图

    主要问题 当尝试使用 ggplot2 制作直方图时 我无法理解为什么日期 标签和中断的处理无法像我在 R 中预期的那样工作 我在找 我的约会频率的直方图 刻度线位于匹配条下方的中心 日期标签在 Y b format 适当的限制 最小化网格空
  • ggplot2以限制为中心的多边形世界地图给出了有趣的边缘

    使用下面的代码我生成了一张以华盛顿特区为中心的地图 解决方案基于科斯克的解决方案在这里 https stackoverflow com questions 10620862 use different center than the pri
  • “条件长度 > 1 并且仅使用第一个元素”错误

    我对 f 语句有疑问 因为它返回给我以下错误消息 条件长度 gt 1 并且仅使用第一个元素 我有一个名为 data summary 的数据框 我想创建两个新变量vol up and vol down取决于我的数据框的其他变量 这是我的脚本代
  • 当我添加形状时,分组哑铃图变得不稳定

    我有以下数据显示白人与黑人在各个领域的一致性百分比 我想创建一个分组哑铃图 其中国家值和州值彼此相邻 以便于比较 Domain c A B C D E F G A B C D E F G A B C D E F G A B C D E F
  • 二部图匹配以匹配两个集合

    我是新手igraphR 中的包 我有两套A and B 每个都有N顶点 A1 A2 AN and B1 B2 BN 每个元素之间都有一个边缘A对每一个元素B 我有一个函数fWgt Ai Bj 返回之间的边的权重Ai and Bj 我一直在尝
  • 如何在 R 中创建“堆叠瀑布”图表?

    I was able to find several packages to create a waterfall chart in R which look like this But I could not find a way to
  • 使用 alpha 通道叠加两个 ggplot2 stat_密度2d 图

    我想叠加两个ggplot2使用 alpha 通道进行绘图 结果图像显示两个数据集 这是我的测试数据 data read table text P1 1 0 4 nP2 0 0 2 nP3 2 1 8 nP4 2 2 6 nP5 0 5 2
  • 考虑到我的图像链接存储在MySQL数据库中,如何通过php显示存储在文件夹中的图像

    作为良好的做法 我只将图像链接存储在数据库中 问题是 我应该如何存储图像的链接 假设它在 c 上 c image jpg 我应该使用哪段 PHP 代码来显示该图像 我只显示路径 我该怎么做才能显示图像 我可以用这个吗 query SELEC
  • 使用实体框架、代码优先方法解决结构问题

    我目前正在使用 EF 和代码优先方法从现有系统构建数据库 最好对 核心 类进行最小的更改 因此 我想找到 Structs 和 EF 的解决方法 是否可以以任何方式将 Struct 包装到类中 以便 EF 可以使用此 Struct 中的数据
  • 如何处理多个连接

    我有一个复杂的查询 需要总共 4 个表中的字段 内部联接导致查询花费的时间比应有的时间长得多 我已经运行了一个 EXPLAIN 语句 其可视化结果附在下面 这是我的查询 SELECT pending corrections correcte
  • 如何在 R 中压缩多个 CSV 文件?

    我正在尝试在 R 中压缩多个 CSV 文件 下面是供参考的代码 Create two dataframes using inbuilt datasets for reproducible code df1 lt head mtcars df
  • 如何在Windows命令行中执行for循环?

    我想知道这是否可能 我不熟悉使用 Windows 命令行 但我必须将它用于我正在处理的项目 我有许多文件 我需要为每个文件执行一个功能 我习惯使用 python 但显然这有点不同 所以我希望得到一些帮助 基本上 我需要 for 循环来迭代文
  • 如何将曲线拟合到直方图

    我已经探讨了有关该主题的类似问题 但在我的直方图上生成漂亮的曲线时遇到了一些麻烦 我知道有些人可能会认为这是重复的 但我目前还没有找到任何可以帮助解决我的问题的东西 尽管数据在此处不可见 但这里是我使用的一些变量 以便您可以在下面的代码中看
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • 调用 UDF 时公式中使用的值的数据类型错误

    我一直在努力找出这里出了什么问题 我有两个包含字符串值的列 我使用第三列调用工作表中的 UDF 但最终得到 Value 并出现错误 公式中使用的值的数据类型错误 Eg Col I Col J File1 Y File1 N File2 Y
  • 使用 unnest() 返回行?

    我尝试在完成后返回一组行UPDATE 像这样的东西 UPDATE Notis new noti SET notis noti record type FROM SELECT FROM Notis WHERE user id 2 FOR UP
  • 通过 R 连接到 Azure SQL

    下面的代码允许我通过 R 连接到 Azure SQL 服务器 但是 我只能访问 主 数据库 而不能访问我在下面创建的两个数据库 表格显示为空白 有什么想法吗 谢谢 library RODBC library dplyr library DB

随机推荐

  • 强制从 s3 亚马逊服务器下载

    我一直在开发一个新的网络应用程序 它依赖于亚马逊S3服务器作为存储系统 以及代码点火器作为 PHP 框架 我需要在单击链接时强制下载文件 原始网址如下所示 http www our web com download do 1 jpg 它会生
  • 主构造函数内的 Scala 局部变量

    在 Scala 中如何在主构造函数中定义局部变量 我需要解决这个练习Scala for the impatient book 编写一个具有接受字符串的主构造函数的 Person 类 包含名字 空格和姓氏 例如 new 人 弗雷德 史密斯 提
  • Kafka 主题分区

    关于 Kafka 主题和分区的一个简单问题 假设以下场景 Producer1将数据写入Topic1 Producer2向Topic2写入数据 Consumer读取Topic 1和Topic 2的数据 Consumer2仅从Topic2读取数
  • S 的最长平衡子序列

    给出的问题 一串括号据说是 如果字符串中的左括号和右括号可以正确配对 则为平衡 例如 字符串 和 都是平衡的 而字符串 则不是 均衡 给定一个字符串S长度n由括号组成 假设你想找到最长的子序列S这是平衡的 使用动态规划 设计一个算法来找到最
  • 从 Resteasy 服务器返回文件

    你好 我想从 Resteasy 服务器返回一个文件 为此 我在客户端有一个链接 它使用 ajax 调用休息服务 我想在其余服务中返回文件 我尝试了这两段代码 但都没有按照我想要的方式工作 POST Path exportContacts p
  • 仅加载关系的 id(pluck)

    我有一个简单的应用程序 使用 Laravel 5 5 13 public function index return Pet all 这列出了所有宠物 我有多对多关系 其中许多用户可以拥有同一只宠物 宠物的人类家庭 我想加载这些用户 Doi
  • 文件夹如何工作?

    谁能解释一下怎么做foldr http haskell org ghc docs latest html libraries base Prelude html v foldr work 举这些例子 Prelude gt foldr 54
  • 如何在phar文件代码中获取.phar文件真实目录?

    我正在尝试创建一个php可执行文件 phar文件 来生成一些文件 我想知道如何获取phar文件的真实路径 在phar文件代码内 我想要做的是在phar文件的同一级别创建一个文件夹并在那里创建新文件 但是realpath DIR 似乎不起作用
  • Git:“工作树”到底是什么?与“工作目录”相同吗?

    我正在阅读大量有关 Git 的文档 最近我一直在寻找 工作树 概念 但我不明白 工作树 到底是什么 我找到了这样的描述 什么是工作树 https mijingo com blog what is the working tree in gi
  • 在 ActionScript 2.0 中按程序访问函数的参数列表

    我已经可以通过执行类似以下操作来获取类中的所有函数 for var member in obj if obj member instanceof Function var f Function obj member 有没有办法在动作脚本中获
  • Haskell、Lisp 和冗长[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 生产中的 Azure SDK 2.2:无法加载文件或程序集“msshrtmi”或其依赖项之一。该系统找不到指定的文件

    我在 StackOverflow 和其他网站上的其他几个线程中读到过有关此问题的信息 其他解决方案都没有解决我的问题 而且大多数都已经过时 引用了旧版本的 Azure SDK 我有一个部署到 Azure 的典型 Azure 网站角色 该角色
  • Postgrex.Error ERROR 42501 unavailable_privilege 无法创建扩展 citext

    我正在尝试创建迁移 这是输出 MIX ENV prod DATABASE URL URL mix ecto migrate info execute CREATE EXTENSION citext Postgrex Error ERROR
  • Firebase 快照顺序错误

    我尝试将存储在 firebase 上的帖子加载到我的 tableView 中 我使用 childAdded 函数按照发布的顺序 从第一个到最后一个 获取帖子 起初它似乎有效 但现在不再有效 我不知道为什么 因此 我在帖子中添加了时间戳并使用
  • 弯曲等高列,但尊重另一列的最大高度[重复]

    这个问题在这里已经有答案了 我如何使下面的代码仅使用CSS flex 而不使用Javascript 第二列有动态内容列表 我需要根据第一列的高度应用滚动条 HTML div class row d flex div class col lg
  • 是否存在类似于 Nonetype 路径的东西?

    在我的课程中 我喜欢用 None 来启动我的路径变量 如果我使用os path很容易与其他路径进行比较 但我更喜欢pathlib风格 有没有解决方案可以做到这一点 import os path1 os path dirname D test
  • Selenium Grid:org.openqa.selenium.WebDriverException:转发新会话时出错用于设置功能的 VM 池为空

    我正在尝试使用 Cucumber 在硒网格上进行 POC 我收到此错误 转发新会话时出错 用于设置功能的虚拟机池为空 这是我的示例代码 公共静态无效configureServer GridHubConfiguration gridHubCo
  • 为什么 Swift 的 AVPlayer 在一场比赛中会加载两次playerItem?

    我正在使用 AVFoundation 的 AVPlayer 来流式传输外部 mp3 文件 我的后端有一个计数器 可以计算文件加载的次数 该服务的唯一客户端只有我一个 每当我触发播放 AVPlayer 时 计数器就会增加 2 这意味着 AVP
  • 使用 Bootstrap Accordion 添加向右箭头

    我想看看是否可以在 Bootstrap Accordion 标题的右侧添加箭头 我希望箭头在手风琴折叠时从下变为向上 这很复杂吗 我只希望标题带有箭头 并让它们在折叠时发生变化 但我在试图解决这个问题时遇到了最大的麻烦 这是代码 Accor
  • 使用 R 优化/向量化数据库查询

    我正在尝试使用 R 查询大型数据库 由于数据库的大小 我编写了一次获取 100 行的查询 我的代码如下所示 library RJDBC library DBI library tidyverse options java parameter