R读取大型数据集内存不足如何解决,如果利用Linux有啥有效方法吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R读取大型数据集内存不足如何解决,如果利用Linux有啥有效方法吗?相关的知识,希望对你有一定的参考价值。

手上有几种不同类型的数据,要使用R语言编程处理,本质上基本都是文本文档,总大小达到28G以上。笔记本内存8G。
已经尝试的方法如下:
1、使用bigmemory,colbycol。但是package无法安装使用。
2、使用ff包。但是在NTFS下最大只能使用16G数据集。
3、使用Linux。安装Ubuntu,在其中运行R。问题在于机器硬盘只有250G,Windows不能抛弃,Ubuntu只能使用其中的三分之一即80G上下。安装时没分配好,只有16G的swap,而要使用ff的话home大小也不够。
4、2,3结合。ext4下ff可以使用的数据集似乎最大可以达到2T。在不卸载重装Ubuntu的情况下,将一块移动硬盘划出40G分区,作为ff的外存储备区。比较懒就用了GPart,结果格式化成ext4之后想改某个权限相关文件一直告诉我没有权限,也不能将数据拷进去……
求问:在不卸载目前的Ubuntu(\home 记得是10G以下,\ 50G以上,swap16G)的情况下,有没有能够读取这批数据的方法?或者能否不利用Linux,在Windows上的R里直接解决?

参考技术A 有个比较简单暴力的方法是fread里的nrows参数设置。
R所有读取数据的函数都有nrows和skip这两个参数,可以写个循环,一个文件分段读取,skip跳过前面读过的,用nrows控制最大读入行数,防止内存不足。
分段处理之后将文件写入本地,用rm将比较大的变量消除掉,用gc()释放这部分内存。
——好处是简单粗暴多平台可用,缺点是,真的很慢……
如果有条件还是建议申请个服务器来跑,比如学生可以询问导师院系有没有用于大型计算的服务器。
另外Unix系统对内存的限制确实是比Windows好些,可惜我也不知道正确的打开方式QAQ本回答被提问者采纳
参考技术B 可以编写程序, 来分段读取数据哦
能否看看wo 的网名的啊 ?帮忙搞定一下 啊

如何在 R 中读取大型数据集 [重复]

【中文标题】如何在 R 中读取大型数据集 [重复]【英文标题】:How to read large dataset in R [duplicate] 【发布时间】:2011-04-27 10:53:00 【问题描述】:

可能重复:Quickly reading very large tables as dataframes in R

嗨,

尝试在 R 中读取大型数据集时,控制台显示以下错误:

data<-read.csv("UserDailyStats.csv", sep=",", header=T, na.strings="-", stringsAsFactors=FALSE)
> data = data[complete.cases(data),]
> dataset<-data.frame(user_id=as.character(data[,1]),event_date= as.character(data[,2]),day_of_week=as.factor(data[,3]),distinct_events_a_count=as.numeric(as.character(data[,4])),total_events_a_count=as.numeric(as.character(data[,5])),events_a_duration=as.numeric(as.character(data[,6])),distinct_events_b_count=as.numeric(as.character(data[,7])),total_events_b=as.numeric(as.character(data[,8])),events_b_duration= as.numeric(as.character(data[,9])))
Error: cannot allocate vector of size 94.3 Mb
In addition: Warning messages:
1: In data.frame(user_msisdn = as.character(data[, 1]), calls_date = as.character(data[,  :
  NAs introduced by coercion
2: In data.frame(user_msisdn = as.character(data[, 1]), calls_date = as.character(data[,  :
  NAs introduced by coercion
3: In class(value) <- "data.frame" :
  Reached total allocation of 3583Mb: see help(memory.size)
4: In class(value) <- "data.frame" :
  Reached total allocation of 3583Mb: see help(memory.size)

有人知道如何读取大型数据集吗? UserDailyStats.csv 的大小约为 2GB。

【问题讨论】:

相关:***.com/questions/1875795/… 和 ***.com/questions/3340568/… 另见:yusung.blogspot.com/2007/09/… 和 ff.r-forge.r-project.org/bit&ff2.1-2_WU_Vienna2010.pdf 【参考方案1】:

当然:

    买一台更大的电脑,尤其是更多的内存 运行 64 位操作系统,请参阅 1) 关于更多内存,现在您可以使用它了 只读您需要的列 读取更少的行 以二进制形式读取数据,而不是重新解析 2gb(效率极低)。

在R 网站上还有一个manual for this。

【讨论】:

【参考方案2】:

您可以尝试使用colClassesread.csv 调用中指定数据类型。

data<-read.csv("UserDailyStats.csv", sep=",", header=T, na.strings="-", stringsAsFactors=FALSE, colClasses=c("character","character","factor",rep("numeric",6)))

尽管使用这种大小的数据集,它可能仍然存在问题,并且没有大量内存可用于您可能想要进行的任何分析。添加 RAM 和使用 64 位计算将提供更大的灵活性。

【讨论】:

【参考方案3】:

如果这是从控制台输出,那么您读取数据,但转换存在问题。

如果您以交互方式工作,则在 read.csv 之后使用 save(data, file="data.RData") 保存数据,关闭 R,运行新实例,使用 load("data.RData") 加载数据,然后查看是否失败。

但是从这个错误消息中,我看到你有转换问题,所以你应该看看。

【讨论】:

以上是关于R读取大型数据集内存不足如何解决,如果利用Linux有啥有效方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

GPU 在训练大型数据集期间内存不足

处理大型数据集时出现内存不足错误

R中的内存高效分类器,用于极宽且不太长的训练集

spark - 在大型数据帧上执行 groupby 和聚合时,java 堆内存不足

蜡炬教育:如何处理机器学习中大型数据的加载问题?

虚拟内存是啥东西?有啥用?如果虚拟内存不足会有啥危害?如何调整虚拟内存的大小?