如何加速rbind?

2023-12-24

我应该从 MS-SQL 服务器下载一个表。

行数大于600万。服务器无法一次返回全部数据。

因此,我编写了一次下载 10,000 行的代码。并且,它在循环中绑定行。

假使,假设getData()函数一次返回一个包含 10000 行的数据框。 (伪代码)

for(i in 1:600)
{
    tempValue <- getData()
    wannagetValue <- rbind(wannagetValue,tempValue)
    print(i)
}

问题是随着时间的推移它会变慢。

我认为像这样使用 rbind 不是一个好主意。

任何建议都会非常有帮助。先感谢您。


以下是我确信可以更好的一些选择:

library(data.table)
library(microbenchmark)

#function to generate your data
getData <- function(){
  data.frame(x=rnorm(10000),y=rnorm(10000),z=rnorm(10000))
}

#using data table's rbindlist each iteration
fDT1 <- function(n){
  dat <- getData()
  for(i in 1:n){
    dat <- rbindlist(list(dat,getData()))
  }
  return(data.frame(dat))
}

#using data table's rbindlist all at once
fDT2 <- function(n){
  return(data.frame(rbindlist(lapply(1:n,function(x) getData()))))
}

#pre-allocating a data frame
fPre <- function(n){
  dat <- data.frame(x=rep(0,n*10000),y=rep(0,n*10000),z=rep(0,n*10000))
  j <- 1
  for(i in 1:n){
    dat[j:(j+10000-1),] <- getData()
    j <- j + 10000
  }
  return(dat)
}

#standard do.call rbind
f2 <- function(n){
  return(do.call(rbind,lapply(1:n,function(x) getData())))
}

#current approach
f <- function(n){
  dat <- getData()
  for(i in 1:n){
    dat <- rbind(dat,getData())
  }
  return(dat)
}

正如你所看到的使用data.table's rbindlist()比基础 R 有了很大的改进rbind()一次追加所有行而不是交互有一个很大的好处,但是如果存在内存问题,这可能是不可能的。您可能还注意到,随着数据大小的增加,速度的提高远不是线性的。

 > microbenchmark(fDT2(5),fDT1(5),fPre(5),f2(5),f(5),
+                fDT2(25),fDT1(25),fPre(25),f2(25),f(25),
+                fDT2(75),fDT1(75),fPre(75),f2(75),f(75),
+                times=10)
Unit: milliseconds
     expr        min         lq     median         uq         max neval
  fDT2(5)   18.31207   18.63969   24.09943   25.45590    72.01725    10
  fDT1(5)   27.65459   29.25147   36.34158   77.79446    88.82556    10
  fPre(5)   34.96257   39.39723   41.24445   43.30319    68.75897    10
    f2(5)   30.85883   33.00292   36.29100   43.53619    93.15869    10
     f(5)   87.40869   97.97500  134.50600  138.65354   147.67676    10
 fDT2(25)   89.42274   99.39819  103.90944  146.44160   156.01653    10
 fDT1(25)  224.65745  229.78129  261.52388  280.85499   300.93488    10
 fPre(25)  371.12569  412.79876  431.80571  485.37727  1046.96923    10
   f2(25)  221.03669  252.08998  265.17357  271.82414   281.47096    10
    f(25) 1446.32145 1481.01998 1491.59203 1634.99936  1849.00590    10
 fDT2(75)  326.66743  334.15669  367.83848  467.85480   520.27142    10
 fDT1(75) 1749.83842 1882.27091 2066.95241 2278.55589  2419.07205    10
 fPre(75) 3701.16220 3968.64643 4162.70585 4234.39716  4356.09462    10
   f2(75) 1174.47546 1183.98860 1314.64585 1421.09483  1537.42903    10
    f(75) 9139.36935 9349.24412 9510.90888 9977.24621 10861.51206    10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何加速rbind? 的相关文章

  • dplyr +“meta”-columns:当列包含要使用的其他列的名称而不是数据时

    我想知道以下问题在 dplyr 中是否有一个优雅的解决方案 要提供一个简单的可重现示例 请考虑以下 data frame df lt data frame a 1 5 b 2 6 c 3 7 ref c a a b b c stringsA
  • 如何在 R 中“推断”面板数据的值?

    我有一个带有 NA 值的面板数据 如下所示 uid year month day value 1 1 2016 8 1 NA 2 1 2016 8 2 NA 3 1 2016 8 3 30 4 1 2016 8 4 NA 5 1 2016
  • 为什么在 data.frame 中预先指定类型会比较慢?

    我预先分配了一个大 data frame 以便稍后填写 我通常这样做NA是这样的 n lt 1e6 a lt data frame c1 1 n c2 NA c3 NA 我想知道如果我预先指定数据类型是否会让事情变得更快 所以我测试了 f1
  • ess-rdired:我收到此错误“现在没有 ESS 进程与此缓冲区关联”

    To use ess rdired为了浏览对象 我按照 ESS 手册并将以下内容添加到我的 emacs autoload ess rdired ess rdired View R objects in a dired like buffer
  • 从每小时中提取/子集分钟值

    我的数据框包含以下格式的日期值YYYY MM DD HH MM SS跨越 125000 多行 按分钟细分 每行代表一分钟 1 2018 01 01 00 04 00 2 2018 01 01 00 05 00 3 2018 01 01 00
  • 如何从R中串扰的filter_select中删除(全部)?

    我遵循图 16 7 的示例https plotly r com client side linking html https plotly r com client side linking html并且无法弄清楚为什么有一个名为 全部 的
  • tidyverse 干扰 ggplot2 吗?无法访问map_data

    在控制台中运行这些命令 输出为 gt cty0 ggplot2 map data county gt library tidyverse Loading tidyverse ggplot2 Loading tidyverse tibble
  • mlogit:需要 TRUE/FALSE 时缺少值

    我有来自离散选择实验 DCE 的数据 该实验研究了来自不同行业的个人的招聘偏好 我已经格式化为长格式 我想使用 mlogit 进行建模 我已导出数据 并且可以使用 asclogit 命令在 Stata 中成功运行模型 但在 R 中运行时遇到
  • 配置 fix() 和 edit() 以从 R/RStudio 在 Notepad++ 中打开

    当我在 RStudio 或 RGUI 中执行此操作时 fix SomeFunction 或使用edit 我可以在记事本中看到该函数的代码 有什么方法可以更改此设置 以便代码预览在 Notepad 中打开 而不是在普通的旧记事本中打开 同样
  • 如何在R中将英尺转换为厘米?

    我得到了一个高度的字符向量 如下所示 859 5 10 5 8 5 11 6 0 5 10 6 2 5 11 6 2 6 2 5 7 5 9 5 7 6 1 6 0 5 11 6 0 6 5 6 1 6 1 5 10 5 11 5 11 6
  • 正则表达式提取美国邮政编码,但不提取假代码

    使用 XML 包和 XPath 从网站上抓取地址 有时我只能得到一个嵌入了我想要的邮政编码的字符串 提取邮政编码很简单 但有时会显示其他五位数字的字符串 以下是 df 中问题的一些变体 zips lt data frame id seq 1
  • R中使用余弦距离的层次聚类

    我想通过使用余弦相似度与 R 编程语言对文档语料库进行层次聚类 但出现以下错误 if is na n n gt 65536L stop 大小不能为 NA 或 超过 65536 需要 TRUE FALSE 时缺少值 我应该怎么办 为了重现它
  • 跨类别和列自动化卡方

    我有一个调查数据框 其中包含几个问题 列 编码为 1 同意 0 不同意 受访者 行 根据 年龄 年轻 中年 老年 地区 东 中 西 等指标进行分类 大约有30个类别总共 3个年龄 3个地区 2个性别 11个职业等 在每个指标中 类别不重叠且
  • Shiny :针对所有错误显示一条消息

    我在 R 的 Shiny 中有一个应用程序 我想处理消息 以便用户看不到发生了什么错误 我知道通过 tags style type text css shiny output error visibility hidden shiny ou
  • 如何对范围内的行进行分组并考虑第三列?

    我有一个遗传数据集 我想对基因组中物理上靠近的遗传变异 行进行分组 我想对每条染色体基因组中某些点范围内的基因进行分组 chrom 我的 点 数据集包含变体 行需要在一定范围内的位置 如下所示 chrom low high 1 500 17
  • 在列标题和配对变量中嵌入数据的数据透视表

    假设我有这样的数据 不幸的是 变量值嵌入在列名称中 library tidyr library dplyr dat lt tribble group var1 var meta1 var2 var meta2 group1 5 2 cat
  • 按名称包含在单个对象中的多个列对 data.frame 进行排序?

    我想排序一个data frame由多列组成 理想情况下使用基础 R 无需任何外部包 尽管如果有必要 就这样吧 读过如何按列对数据框进行排序 https stackoverflow com questions 1296646 how to s
  • ggplot2 + 使用比例 X 的日期结构

    我真的需要帮助 因为我已经迷路了 我正在尝试创建一个折线图 显示几个团队一年来的表现 我将一年分为几个季度 2012 年 1 月 1 日 2012 年 4 月 1 日 2012 年 8 月 1 日 12 1 12 并将 csv 数据帧加载到
  • 从 leafletProxy() 返回渲染的传单地图

    是否可以在渲染后在 Shiny 中检索传单地图 下面是一个代码示例 展示了如何生成地图leaflet 与返回的不同leafletProxy 即使它们在渲染时看起来完全相同 是否有一个功能可能不同于leafletProxy 获取实际的 htm
  • 解压 R 数据框中的列表

    我有一个dataframe其中一个字段包含不同长度的列表 我想将该字段中列表的每个元素提取到其自己的字段中 以便我可以将结果收集到一个很长的字段中dataframe每个列表元素都有一个 id 这是一个例子dataframe dat lt s

随机推荐

  • 如何使用LWP设置User-Agent?

    我有 Perl LWP 书 但是如何设置用户代理字符串 这就是我所拥有的 use LWP UserAgent use LWP Simple Used to download files my u URI gt new url my resp
  • 使用 mysql 和 php 将用户名从会话记录到表中

    我有一个用 mysql 和 php 开发的数据库系统 还有一个登录系统 我使用会话 但是当用户添加一条记录时 我希望它也记录添加它的用户 我认为会话将 允许我这样做但我不知道如何从会话中检索用户名并将其添加到表中 简单插入的示例 INSER
  • 访问模板中的vue环境变量

    我想从vue单文件组件的模板访问我的环境变量 但是 执行以下操作 img alt 给我错误 Property or method process is not defined on the instance but referenced d
  • 归并排序时间和空间复杂度

    我们以合并排序的实现为例 void mergesort Item a int l int r if r lt l return int m r l 2 mergesort a l m 1 mergesort a m 1 r 2 merge
  • “打印”和“返回”之间有什么正式区别? [复制]

    这个问题在这里已经有答案了 假设我定义了一个简单的函数 它将显示传递给它的整数 def funct1 param1 print param1 return param1 输出将是相同的 但是我知道当return语句在函数中使用 输出可以再次
  • WebView 代码在 Android 4.4.2 (API 19) 模拟器上生成 Uncaught TypeError 和 Uncaught ReferenceError 错误

    我的代码在 Android 4 4 2 KitKat API 19 模拟器上运行时遇到问题 当我在 Android 4 3 API 18 模拟器上模拟我的项目时 它可以正常工作并使用 MathJax 创建数学表达式 模拟器图像 https
  • Python 中的参数依赖性 - 无法使其工作

    我正在尝试向我的脚本添加参数依赖项 这个想法是 clone参数需要非空 gituser 细读后这个例子 https stackoverflow com questions 21879657 argparse argument depende
  • 路由音频输入以从 iPhone 上的 TOP 麦克风接收

    我正在编写一个小应用程序来录制多个曲目并相互播放 我正在使用 PlaybackAndRecord 模式 并将输出路由到主扬声器 问题是底部麦克风仍然用于输入 所以现在当我录制时 我会在新轨道上得到其他轨道的输出 声音非常大 这是我到目前为止
  • 在 Python 中解析 PAC 文件而不使用 C 模块

    我处于无法使用 pacparser 库的困境 我希望有人有一个纯 python 解决方案 没有 C c 模块 我有一个返回多个代理的 PAC 文件 function FindProxyForURL url host if isPlainHo
  • Jetty注解超时原因

    我正在使用 Maven jetty 插件运行我的 Web 应用程序 但启动一段时间后 出现错误 INFO Web defaults org eclipse jetty webapp webdefault xml INFO Web overr
  • 仅使用 Android 中的电子邮件客户端应用程序发送电子邮件

    我想实现一个发送电子邮件的选项 现在我可以发送电子邮件 但问题是 Android 显示了许多可以发送的应用程序 例如蓝牙 facebook 消息等 但这些不是必需的 我需要避免这种情况并仅显示电子邮件客户端应用程序 Intent inten
  • 在 shell 脚本之间导出变量

    我有两个独立运行的脚本 第一个假设脚本 A 计算一些值 我想从其他名为 B 的脚本中回显这些值 这些脚本不会互相调用 我使用了导出关键字 但没有用 我怎样才能做到这一点 如果我理解了这个要求 那么两个脚本就不能简单地在同一个子 shell
  • rsync .git 目录

    这个问题可能是因为我对 gits 和 git 存储库的一般作用缺乏了解 但是 我可以将目录与我创建的内容同步吗git init机器之间 我的笔记本电脑上有一个存储库 将其从那里获取的唯一方法是 scp rsync 到远程主机 我可以从中再次
  • 在 C 中将字母转换为数字

    我正在尝试编写一个将字母转换为数字的代码 例如 一个 gt 0 B gt 1 C gt 2 等等 我正在考虑编写 26 个 if 语句 我想知道是否有更好的方法来做到这一点 谢谢你 这是我觉得比以前更好的方式switch方法 但符合标准 不
  • 函数无法处理较大的 n 值(接近 400)

    这是来自一个统计项目 我定义了下面的函数 但是当 n 接近 400 时 第二个方法很慢 第一个方法很好 这里有些人帮助了我在这个问题中 https stackoverflow com questions 32608913 how to op
  • 使用libxml2 sax解析器时如何从xml中获取属性的名称和值?

    我一直试图通过使用 libxml2 解析 iPhone 应用程序上的 api 来检测一些通用 xml 中属性的名称和值对 对于我的项目来说 解析速度非常重要 所以我决定使用 libxml2 本身而不是使用 NSXMLParser 现在 参考
  • ubuntu 中的 libc 还是 glibc?

    我对这些库有点困惑 我现在在 Ubuntu 上工作 我使用 g 5 我看到我的应用程序链接在 libc so 中 它是Ubuntu的C标准库的实现吗 和glibc有区别吗 ldd application exe libc so 6 gt l
  • 分离实体和延迟加载字段 - 工作线程

    我有以下问题 A 类从数据库中检索一些对象 这些对象本身就是可运行的 并在线程池中运行它们 它们需要在运行时更新其状态 它们更新在其上注册的侦听器 问题是它们在实体处于分离状态时访问延迟加载的字段 因为事务仅覆盖主线程 所以当然有例外 调用
  • 如何使用Serde解析多种不同类型的YAML文件? [复制]

    这个问题在这里已经有答案了 我正在尝试解析这个 YAML 文件 application build something container name another thing environment ONE ENV fake SEC EN
  • 如何加速rbind?

    我应该从 MS SQL 服务器下载一个表 行数大于600万 服务器无法一次返回全部数据 因此 我编写了一次下载 10 000 行的代码 并且 它在循环中绑定行 假使 假设getData 函数一次返回一个包含 10000 行的数据框 伪代码