以节省内存的方式增长 data.frame

2023-11-27

根据逐行创建 R 数据框,附加到 a 并不理想data.frame using rbind,因为它每次都会创建整个 data.frame 的副本。我如何积累数据R导致data.frame而不受到这种处罚?中间格式不需要是data.frame.


第一种方法

我尝试访问预分配的 data.frame 的每个元素:

res <- data.frame(x=rep(NA,1000), y=rep(NA,1000))
tracemem(res)
for(i in 1:1000) {
  res[i,"x"] <- runif(1)
  res[i,"y"] <- rnorm(1)
}

但是tracemem变得疯狂(例如data.frame每次都被复制到新的地址)。

替代方法(也不起作用)

一种方法(不确定它是否更快,因为我还没有进行基准测试)是创建一个 data.frames 列表,然后stack他们在一起:

makeRow <- function() data.frame(x=runif(1),y=rnorm(1))
res <- replicate(1000, makeRow(), simplify=FALSE ) # returns a list of data.frames
library(taRifx)
res.df <- stack(res)

不幸的是,在创建列表时,我认为您将很难预先分配。例如:

> tracemem(res)
[1] "<0x79b98b0>"
> res[[2]] <- data.frame()
tracemem[0x79b98b0 -> 0x71da500]: 

换句话说,替换列表的元素会导致列表被复制。我假设整个列表,但也可能只是列表中的那个元素。我不太熟悉 R 内存管理的细节。

可能是最好的方法

与当今许多速度或内存有限的进程一样,最好的方法很可能是使用data.table代替data.frame。自从data.table:=通过引用运算符赋值,可以更新而无需重新复制:

library(data.table)
dt <- data.table(x=rep(0,1000), y=rep(0,1000))
tracemem(dt)
for(i in 1:1000) {
  dt[i,x := runif(1)]
  dt[i,y := rnorm(1)]
}
# note no message from tracemem

但正如@MatthewDowle 指出的那样,set()是在循环内执行此操作的适当方法。这样做会使速度更快:

library(data.table)
n <- 10^6
dt <- data.table(x=rep(0,n), y=rep(0,n))

dt.colon <- function(dt) {
  for(i in 1:n) {
    dt[i,x := runif(1)]
    dt[i,y := rnorm(1)]
  }
}

dt.set <- function(dt) {
  for(i in 1:n) {
    set(dt,i,1L, runif(1) )
    set(dt,i,2L, rnorm(1) )
  }
}

library(microbenchmark)
m <- microbenchmark(dt.colon(dt), dt.set(dt),times=2)

(结果如下所示)

标杆管理

循环运行 10,000 次后,数据表几乎快了整整一个数量级:

Unit: seconds
          expr        min         lq     median         uq        max
1    test.df()  523.49057  523.49057  524.52408  525.55759  525.55759
2    test.dt()   62.06398   62.06398   62.98622   63.90845   63.90845
3 test.stack() 1196.30135 1196.30135 1258.79879 1321.29622 1321.29622

benchmarks

以及比较:= with set():

> m
Unit: milliseconds
          expr       min        lq    median       uq      max
1 dt.colon(dt) 654.54996 654.54996 656.43429 658.3186 658.3186
2   dt.set(dt)  13.29612  13.29612  15.02891  16.7617  16.7617

注意n这里是 10^6,而不是上面绘制的基准中的 10^5。因此,工作量增加了一个数量级,并且结果以毫秒而不是秒来衡量。确实令人印象深刻。

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

以节省内存的方式增长 data.frame 的相关文章

  • 将 Pandas 系列转换为 DataFrame 中的日期时间

    我有一个 Pandas DataFrame 如下 ReviewID ID Type TimeReviewed 205 76032930 51936827 ReportID 2015 01 15 00 05 27 513000 232 760
  • 在 R 中按邮政编码绘制美国地图上的点,并插入阿拉斯加和夏威夷

    我正在尝试以密度点格式在美国地图上绘制点 其中每个邮政编码的点的大小根据该邮政编码中从事某种职业的人数而定 我已经非常接近我需要的东西 但正在努力获取阿拉斯加和夏威夷的坐标 它们需要在插图上 这里的第一组代码是我所拥有的 loc full2
  • R:如何在不耗尽内存的情况下重新绑定两个巨大的数据帧

    我有两个数据框df1 and df2每个都有大约 1000 万行和 4 列 我使用 RODBC sqlQuery 将它们读入 R 没有任何问题 但是当我尝试rbind他们 我收到了最可怕的 R 错误消息 cannot allocate me
  • R 版本 4.0.0 上的 ROracle

    当尝试使用 ROracle 时 我收到以下错误消息 gt library ROracle Error package or namespace load failed for ROracle package ROracle was inst
  • 如何更改 R Markdown HTML 文档中目录的颜色和属性?

    我花了很多时间谷歌搜索这个 但似乎无法弄清楚 我正在使用 R Markdown 制作 HTML 文档 文档在这里 http rmarkdown rstudio com html document format html http rmark
  • 将一个 Rmarkdown 文档中的代码块插入到另一个 Rmarkdown 文档中

    我一直在举办一些小型 R 教程 研讨会 我将 挑战脚本 保存在 Rmarkdown 文档中 它们包含自由文本和 R 代码块 一些代码块是预先填充的 例如 为了设置数据集以供以后使用 而一些代码块则供与会者在研讨会期间填写代码 对于每个挑战脚
  • 基于 dplyr 中的向量创建新列

    With dplyr使用以下命令可以轻松创建新列mutate df lt data frame v1 1 3 v2 c a b c gt mutate df newcol NA v1 v2 newcol 1 1 a NA 2 2 b NA
  • 在 R 中绘制 3D 数据

    我有一个 3D 数据集 data data frame x rep c 0 1 0 2 0 3 0 4 0 5 each 5 y rep c 1 2 3 4 5 5 data z runif 25 min data x data y 0 1
  • 如何创建具有特定于每个方面的标题和副标题的分面图?

    生成一个图 该图与每列的单独图相结合 带有标题和副标题 以及每个图的垂直线 我使用直方图创建了带有垂直线的列 library ggplot2 library gridExtra library tidyr actualIris lt dat
  • 添加一条适合 R 中绘图峰值的曲线?

    如果给定两个向量及其图 是否有一个函数可以添加一条适合峰值的曲线 例如 我有 x c 0 20 X 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 y 1 19 4 17 9 8
  • 在 Rdata 中保存矩阵并更新 Rdata 文件

    我有一个矩阵 mat lt matrix data 1 30 ncol 10 nrow 3 我想将其保存到 Rdata save mat file m Rdata 然后加载回来 m lt load m Rdata 然后看看它的内容 m 1
  • R dbGetQuery 与动态字符串

    From 这个帖子 https stackoverflow com questions 3416973 dynamic string in r and 这个帖子 https stackoverflow com questions 34496
  • R 中 bquote 中的拼接

    假设我正在使用 R 的反引号运算符构建一个表达式bquote 并且我想在列表中的特定位置 拼接 即丢失列表的外括号 例如 我有表达式 5 4 我想在其开头添加 6 而不使用字符串操作 即完全对符号结构进行操作 So gt b quote 5
  • 在动画 ggplot2 中的轴标签上包含图像

    我创建了一个动画条形图 显示玩家的进球数 虚构 请参阅示例的复制数据 df lt data frame Player rep c Aguero Salah Aubameyang Kane 6 Team rep c ManCity Liver
  • 计算 Dataframe 中具有 1 个或多个 NaN 的行数

    我有以下内容 print df isna sum 这给了我 city 2 country 0 testid 0 house 1807 house number 248 po box 1845 zipcode 260 road 132 sta
  • 读取 csv 文件时出错

    我有一个 xlsx 文件 为了从 Rstudio 读取 我将其保存为 csv 文件 现在 当我尝试从 Rstudio 读取文件时 收到以下错误 setwd D DATA SCIENCE CCPP Linear regression ccpp
  • VMA和ELF段之间的关系

    我需要确定 ELF 可执行文件的可加载段的 VMA VMA 可以从以下位置打印 proc pid maps VMA 之间的关系如下所示maps可加载段对我来说也很清楚 每个段由一个或多个 VMA 组成 内核使用什么方法从 ELF 段形成 V
  • 将代表扩展到矩阵?

    如果你打电话rep在矩阵上 它重复其元素而不是整个矩阵 传统的修复方法是调用rep list theMatrix 我想延长rep以便它自动执行此操作 我尝试使用 rep matrix lt function x rep list x 这确实
  • 如何在R中生成多个矩阵

    我在 R 中得到了两个值列表 daily max car List 1 21 21 22 22 22 22 21 daily 0 8 List 2 16 17 17 17 18 17 17 尝试在 R Studio 中编写一个 For 循环
  • ggplot2条形图:按数据顺序填充

    给出这样的数据框 sam lt data table title c rep Cat 8 rep Dog 4 fcat c A B C B B C C B C B B C fnum c seq 8 1 seq 4 1 labeltext c

随机推荐

  • 是否可以在 字段中放置链接?

    是否可以在此处放置登录和注册链接
  • 如何确定最佳线程堆栈大小?

    实际上 有两种大小 初始承诺和总保留 您使用静态分析还是动态分析 哪些工具 哪些技术 一种技术是在 main 或线程 main 中使用已知值绘制堆栈 然后在清理时从堆栈限制进行扫描 直到不再找到已知值 您的堆栈末端将被定义为符号 生成一个
  • 从 IDE 禁用 C++ PDB 生成

    我们需要抑制调试符号的生成 项目属性 配置属性 c c 常规 调试信息格式下可用的选项相当于 Z7 Zi 和 ZI 我找不到完全省略 Zx 标志的方法 Unlike 这里的情况 我们正在从 IDE 进行构建 我使用的是Visual Stud
  • 生成 JavaScript 数组的排列[重复]

    这个问题在这里已经有答案了 我在 javascript 中有一个由 n 个不同元素组成的数组 我知道有 n 个 对这些元素进行排序的可能方法 我想知道生成该数组的所有可能顺序的最有效 最快 算法是什么 我有这个代码 var swap fun
  • python 3.9.5 中的相对导入

    我的文件夹结构如下 fff init py fg init py settings init py settings py obng test py 我想将 fg settings 中的 settings py 作为模块导入到 test p
  • ThreeJS 停止渲染

    我正在使用 ThreeJS 处理具有 OrbitControls 的基本 3d 场景 一切都很好 除了它导致我的整个网站滞后 因为即使用户没有看它 它也会自行循环 我想要一个函数 当满足某些条件时 在这种情况下 用户没有查看画布 我可以调用
  • 在 Java 中通过正则表达式查找最后一个索引

    我有一根绳子 O O O 我想找到最后一个 来分割字符串 第一次尝试是 POL 但这让它包含了 O 这是显而易见的 有人给点建议吗 我同意使用标准 String lastIndexOf 方法是最好的做法 但我最近使用了 Regex 部分 即
  • 几乎所有 pod 数据都可以用reinterpret_cast(布局兼容性是否足够)

    我正在尝试了解static cast and reinterpret cast 如果我是正确的 标准 9 2 18 说的是reinterpret castpod 数据是安全的 指向 POD 结构对象的指针 使用适当转换reinterpret
  • 如何在由用于表示文字的字符类型参数化的模板中表达字符串文字?

    考虑下面的简单地图 class MyCoolMap public unordered map
  • NSTextAlignment.Justified 对于 UILabel 不起作用

    我试图证明我的合理性UILabel文本 但它不起作用 我的声明UIView descriptionUIView UIView frame CGRect x 0 y 0 width self view frame width height s
  • 当蓝牙设备在附近时唤醒 ios 应用程序

    我正在后台运行核心蓝牙来扫描设备 它工作正常 当我手动退出应用程序时几乎停止 苹果文档指出 应用程序有时可以被外设唤醒 这可能会使它从挂起状态持续大约 10 秒左右 执行一些操作 然后返回挂起状态 Source https develope
  • 在调用另一个引用 self 的方法的块内调用一个方法是否会导致保留循环?

    Can doFirst在这里引起保留周期 interface Example NSObject property nonatomic strong void block end implementation Example void doF
  • Android 如何在全屏模式下软键盘可见时调整布局

    我做了很多研究来调整软键盘处于活动状态时的布局 并且我已经成功实现了它 但是当我使用时问题就出现了android theme android style Theme NoTitleBar Fullscreen 这在清单文件中的我的活动标记中
  • 在 Jekyll 中如何按帖子数对 site.tags 进行排序?

    抱歉 我是 Ruby 新手 但我正在尝试向我的模板添加一个液体标签 我可以循环显示五个最流行标签的列表 由于某种原因 当我使用这个插件时 它只输出一个标签 这是我在 mu 插件中放入的内容 module Jekyll class Popul
  • 如何使用 Swift 创建具有动态单元高度的静态单元

    我已经看过几个教程 这些教程展示了如何设置动态单元高度 但所有这些教程仅在您通过设置适当的约束并使用动态单元来使用动态单元时才显示UITableViewAutomaticDimension 但是 我想对静态单元格执行此操作 我的应用程序中有
  • 如何在 Django 中组织 JS 文件?

    我目前正在处理一个 Django 项目 我包含不同的 JS 库 并创建 JS 文件来管理其他库 但我不知道每个 html 页面的 JS 文件的正确组织 例如 我有一个 Main js 和 Milk js 位于基本模板中 但我不希望这两个文件
  • for 循环在 CMD 提示符下工作,但不在批处理文件中工作 - for 循环是复制粘贴的

    注意 我几乎不知道批处理文件 for 循环是如何工作的 我当前拥有的批处理文件 C Program Files x86 HMA Pro VPN bin HMA Pro VPN exe connect C Program Files x86
  • 测试 Chef 角色和环境

    我是 Chef 新手 一直在使用测试厨房测试我的食谱的有效性 效果很好 现在 我试图在最初运行 Chef 之前确保生产节点上特定于环境的属性正确 这些将在角色中定义 例如 我可能有使用带有开发设置的 Vagrant 盒子聚合的菜谱 这会验证
  • 服务器如何处理来自多个客户端的 Web 服务请求

    我刚刚完成了一个 Android 应用程序 它使用 Web 服务连接到远程数据库 我在本地主机上工作 现在 我计划在服务器上托管我的 Web 服务 假设我的 Android 应用程序安装在任意数量的不同客户端智能手机上 每个智能手机用户同时
  • 以节省内存的方式增长 data.frame

    根据逐行创建 R 数据框 附加到 a 并不理想data frame using rbind 因为它每次都会创建整个 data frame 的副本 我如何积累数据R导致data frame而不受到这种处罚 中间格式不需要是data frame