返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >R语言-解决处理矩阵遇到内存不足的问题
  • 243
分享到

R语言-解决处理矩阵遇到内存不足的问题

2024-04-02 19:04:59 243人浏览 八月长安
摘要

如下: Error : cannot allocate vector of size X Gb 类似于这种问题的可能处理办法: 1. 可以用matrix尽量不要用data fra

如下:

Error : cannot allocate vector of size X Gb

类似于这种问题的可能处理办法:

1. 可以用matrix尽量不要用data frame;

2. 可以用integer matrix尽量不要用 double matrix;

3. 对于大量运算后最好加上一个GC(), 强制R语言回收内存;

4. 对于大矩阵而言用bigmemory包,可以将大矩阵放到临时文件中,不占用内存。

补充:R语言之内存管理

在处理大型数据过程中,R语言的内存管理就显得十分重要,以下介绍几种常用的处理方法。

1,设置软件的内存


memory.size(2048) #设置内存大小   
memory.size(NA) #查看当前设置下最大内存 
#or  
memory.limit()   
memory.size(F) #查看当前已使用的内存   
#or   
library(pryr)   
mem_used()   
   
mem_change(x <- 1:1e6) #查看执行命令时内存的变化   
memory.size(T)  #查看已分配的内存

注意刚开始时已使用内存和已分配内存是同步增加的,但是随着R中的垃圾被清理,已使用内存会减少,而已分配给R的内存一般不会改变。

2,对象的存储

R中的对象在内存中存于两种不同的地方,一种是堆内存(heap),其基本单元是“Vcells”,每个大小为8字节,新来一个对象就会申请一块空间,把值全部存在这里,和C里面的堆内存很像。第二种是地址对(cons cells),和LISP里的cons cells道理一样,主要用来存储地址信息,最小单元一般在32位系统中是28字节、64位系统中是56字节。


ls()           #查看当前对象   
object.size()    查看对象所占内存   
#or   
library(pryr)   
object_size()  #区别于前者,它进行了换算

1) 新建对象分配合适的内存

R会将新的对象存储在“连续”的内存中,如果没有这样的空间就会返回“Cannot allocate vector of size...” 的错误,有以下几种处理方法:

a) 如果有多个矩阵需要存储,确保优先存储较大的矩阵,然后依次存储较小的矩阵.

b) 预先分配合适的内存.

大家都知道R中矩阵的维度并不需要赋一个固定的值(很多语言的数组长度不能为变量),这为写程序带来了极大的方便,因此经常在循环中会出现某个矩阵越来越长的情况,实际上,矩阵每增长一次,即使赋给同名的变量,都需要新开辟一块更大的空间,假设初始矩阵为100K,第二个为101K,一直增到120K,那么,将会分别开辟100K、101K一直到120K的连续堆内存,如果一开始就开一块120K的,使之从101K逐渐增长到120K,将会大大地节约内存。cbind函数也是这个道理,所以在循环中要注意不要滥用。

c) 换到64位的计算机,这种问题较少出现.

2) 改变当前对象的存储模式

例如某个矩阵默认就是"double"的,如果这个矩阵的数值都是整数甚至0-1,完全没必要使用double来占用空间,可以将其改为整数型,可以看到该对象的大小会变为原来的一半。

storage.mode(x) #查看对象的存储模式 storage.mode(x) <- "integer" #整数型存储模式

3) 清理中间对象

rm() #删除变量的引用,经常用它来清理中间对象,其中比较重要的文件可以存在硬盘里,比如csv文件或者Rsqlite等

gc() #清理内存空间

4) 清理其他对象

.ls.objects() #查看内存消耗较大的文件,并处理掉其他无关对象.代码如下:


.ls.objects <- function (pos = 1, pattern, order.by = "Size", decreasing=TRUE, head = TRUE, n = 10) {   
  napply <- function(names, fn) sapply(names, function(x)   
          fn(get(x, pos = pos)))   
  names <- ls(pos = pos, pattern = pattern)   
  obj.class <- napply(names, function(x) as.character(class(x))[1])   
  obj.mode <- napply(names, mode)   
  obj.type <- ifelse(is.na(obj.class), obj.mode, obj.class)   
  obj.size <- napply(names, object.size) / 10^6 # megabytes   
  obj.dim <- t(napply(names, function(x)   
            as.numeric(dim(x))[1:2]))   
  vec <- is.na(obj.dim)[, 1] & (obj.type != "function")   
  obj.dim[vec, 1] <- napply(names, length)[vec]   
  out <- data.frame(obj.type, obj.size, obj.dim)   
  names(out) <- c("Type", "Size", "Rows", "Columns")   
  out <- out[order(out[[order.by]], decreasing=decreasing), ]   
  if (head)   
    out <- head(out, n)   
  out   
} 

3,修改存储地址

这部分可参考文献1。在xp系统上试了一下,得到的存储地址总是不变,不知道xp系统上有没有效...

4,选取数据集的子集

这是没有办法的办法,迟早要处理全部的数据,不过可以借此调试代码或是建模,如在合适的地方清理中间对象

5,写成脚本文件

Hadley Wickham 建议写成脚本文件,运行后再清理掉临时文件

6,使用SOAR包

它可以将特定对象存储为RData文件并无需加载到内存就能进行分析


r = data.frame(a=rnORM(10,2,.5),b=rnorm(10,3,.5))   
library(SOAR)   
Sys.setenv(R_LOCAL_CACHE=”testsession”)   
ls()   
Store(r)   
ls()   
mean(r[,1])   
r$c = rnorm(10,4,.5)   
ls()

7,一个有趣的函数

它会告诉你哪一行的代码消耗了多少时间、内存,释放多少内存,复制了多少向量.


library(devtools)   
devtools::install_GitHub("hadley/lineprof")   
library(lineprof)   
source("D:/test/test.R")   
prof <- lineprof(test("D:/test/testcsv"))   
shine(prof)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

本文标题: R语言-解决处理矩阵遇到内存不足的问题

本文链接: https://lsjlt.com/news/124279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • R语言-解决处理矩阵遇到内存不足的问题
    如下: Error : cannot allocate vector of size X Gb 类似于这种问题的可能处理办法: 1. 可以用matrix尽量不要用data fra...
    99+
    2024-04-02
  • R语言如何解决处理矩阵遇到内存不足的问题
    小编给大家分享一下R语言如何解决处理矩阵遇到内存不足的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属...
    99+
    2023-06-14
  • 解决R语言中install_github中无法安装遇到的问题
    首先,让我们来进入常规步骤 我安装的是recharts包,正常的写法呢,就是以下这个样子: install.packages("devtools") #devtools::ins...
    99+
    2024-04-02
  • 基于R语言xlsx安装遇到的问题及解决方案
    1、java环境的安装,如果java安装的是64位使用R软件一定要是64位,如果使用32位会报错,版本一定要对应。 2、安装顺序要是install.packages(“rJava”)...
    99+
    2024-04-02
  • 如何解决R语言中install_github中无法安装遇到的问题
    这篇文章将为大家详细讲解有关如何解决R语言中install_github中无法安装遇到的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU...
    99+
    2023-06-14
  • 解决R语言 数据不平衡的问题
    R语言解决数据不平衡问题 一、项目环境 开发工具:RStudio R:3.5.2 相关包:dplyr、ROSE、DMwR 二、什么是数据不平衡?为什么要处理数据不平衡? 首先我们要知...
    99+
    2024-04-02
  • 如何解决虚拟机内存不足的问题
    解决虚拟机内存不足的问题有几种方法: 增加虚拟机内存:可以通过虚拟机管理工具增加虚拟机的内存大小,提高虚拟机的内存容量。 优化虚拟机内存使用:可以通过关闭不必要的应用程序或服务,减少虚拟机内存的占用,从而提高虚拟机的内存利用率。 ...
    99+
    2024-06-11
    virtualbox
  • Python开发中遇到的内存管理问题及解决方案
    Python开发中遇到的内存管理问题及解决方案摘要:在Python开发过程中,内存管理是一个重要的问题。本文将讨论一些常见的内存管理问题,并介绍相应的解决方案,包括引用计数、垃圾回收机制、内存分配、内存泄漏等。并提供了具体的代码示例来帮助读...
    99+
    2023-10-22
    内存泄漏 垃圾回收 内存优化
  • 如何解决Go语言中的内存管理问题?
    如何解决Go语言中的内存管理问题?在Go语言中,内存管理是一个重要的话题。由于Go语言自带的垃圾回收器(Garbage Collector)的存在,开发者不需要手动管理内存分配和释放,但这并不意味着我们可以完全忽视内存管理的问题。不合理的内...
    99+
    2023-10-22
    解决方案 Go语言 内存管理
  • 解决R语言安装时出现辑程包不存在的问题
    【解决方案】 1.使用命令单独安装caret,安装的时间很长。 install.packages("caret", dependencies = c("Depends", "S...
    99+
    2024-04-02
  • Jackson处理Optional时遇到问题的解决与分析
    目录前言目录正文1. 序列化Optional类型的问题2. 原因分析3. 解决办法总结前言 Optional是Java8中增加的一个特性,它的出现是为了解决Java中的空指针问题,相...
    99+
    2024-04-02
  • 如何解决thinkphp5中图片处理遇到的问题
    这篇文章将为大家详细讲解有关如何解决thinkphp5中图片处理遇到的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图片处理中遇到的问题我额外把图片的处理和上传封装成了一个类,返回保存的图片路径在图片...
    99+
    2023-06-15
  • 索尼如何解决Linux带来设备内存不足的问题
    索尼如何解决Linux带来设备内存不足的问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。索尼的工程师 Peter Enderborg 近日在 LKML 的一封邮件中提出了一个...
    99+
    2023-06-15
  • 图像处理中遇到的Python问题及解决方案
    图像处理中遇到的Python问题及解决方案摘要:图像处理在计算机视觉和图形学领域具有广泛的应用。Python作为一种流行的编程语言,也广泛应用于图像处理中。然而,当我们在图像处理中使用Python时,可能会遇到一些常见的问题。本文将介绍一些...
    99+
    2023-10-22
  • C语言执行程序时遇到的常见问题及解决
    目录执行程序闪退的两种解决方式1.新命名一个头文件2.选择 开始执行(不调试)   总结执行程序闪退的两种解决方式 我相信不少刚踏入C的同学,包括我身边不少...
    99+
    2023-03-03
    C语言执行程序 执行程序问题 C语言程序
  • Golang处理浮点数遇到的精度问题怎么解决
    这篇文章主要介绍“Golang处理浮点数遇到的精度问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang处理浮点数遇到的精度问题怎么解决”文章能帮助大家解决问题。一、浮点数是什么?浮...
    99+
    2023-06-29
  • C语言执行程序时遇到的常见问题如何解决
    本文小编为大家详细介绍“C语言执行程序时遇到的常见问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言执行程序时遇到的常见问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.新命名一个头文...
    99+
    2023-07-05
  • C语言结构体中内存对齐的问题理解
    目录前言思考结构体在内存中开辟空间时内存对齐的规则为什么存在内存对齐1.平台的原因2.性能的原因前言 学C的同学应该知道~ 想精通C语言就不得不面对—指针与内存 续上次指...
    99+
    2024-04-02
  • 如何解决Go语言中的并发内存泄漏问题?
    如何解决Go语言中的并发内存泄漏问题?引言:随着大数据和云计算时代的到来,对于并发编程的需求变得越来越迫切。而Go语言作为一门支持高并发的语言,受到了广泛的关注和应用。然而,并发编程不仅仅带来了高性能和高效率,同时也带来了一些风险,其中最常...
    99+
    2023-10-22
    内存管理 并发控制 内存泄漏修复
  • 如何解决Go语言中的并发内存访问冲突问题?
    如何解决Go语言中的并发内存访问冲突问题?在Go语言中,我们可以使用goroutine来实现并发编程,这无疑给我们带来了更强大的性能和并行处理能力。然而,并发编程也会引发一些问题,其中最常见的就是内存访问冲突。内存访问冲突问题是指多个gor...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作