【问题标题】:is there a way to reduce the memory needed by a vector in R?有没有办法减少 R 中的向量所需的内存?
【发布时间】:2017-02-21 22:13:49
【问题描述】:

这是我之前帖子here的扩展。

我在 R 工作。

总之,我的向量是巨大的(13gb),但它们不应该如此。原始 csv 文件是该大小的一小部分。可以想象,13gb 的内存比我的机器多一点,更不用说分配给 R 的内存了。

我目前正在处理的代码是:

data1<-read.csv("stackexample.csv") ##read in dummy data
data1C<- data1[,3:13] #cut off the ends
SvDvDis<-data1C[c(-3,-4,-6,-7,-9,-10,-11)] #drop individual columns
attach(ScDcDis) #attach for simplicity sake
sm.ancova(s,dt,dip,model="none") #non-parametric ANCOVA

可以在my dropbox 上找到一个虚拟数据文件。

有没有办法减少这个函数正在使用的内存,或者是否有替代编码/函数以较少的内存密集方式执行相同的分析(非参数 ANCOVA)?需要明确的是,不要询问统计数据。我在问如何以更节省内存的方式做到这一点。

【问题讨论】:

  • 感谢您提供数据。话虽如此,Dropbox 和 Google Drive(等)链接不允许用于共享数据,因为它们存在安全风险,并且随着时间的推移它们往往会中断。
  • fANCOVA via - cran.r-project.org/web/packages/fANCOVA - 也许吧?
  • @Hack-R 感谢您的提醒。是否有更好/首选的方法来共享虚拟数据以提供可重复的示例? @thelatemail 我会试一试并报告,谢谢
  • @Jesse001 是的,如果它很大,您可以在代码中模拟/创建它。小的时候使用dput()。我下载了你的文件,这个文件很容易在代码中创建。仅供参考attach() 是一个非常糟糕的命令,因为它会导致各种问题(不是在这种情况下,而是在一般情况下)。有一个重要的派系希望将其从语言中全部删除。
  • 您的数据没有问题。 sm.ancova 函数可能存在问题。我不知道那是做什么的。尝试联系包的作者。

标签: r memory out-of-memory


【解决方案1】:

这是我的建议,它在我简陋的笔记本电脑上运行良好。您可以通过均值检验对其进行补充,以确保样本充分反映总体。

data1   <- read.csv("stackexample.csv") ##read in dummy data

library(dplyr)
library(sm)

data2 <- sample_n(data1, 10000) # make statistics work for you -- sample the data
sm.ancova(x     = data2$s,
          y     = data2$dt,
          group = data2$dip,
          model = "none") #non-parametric ANCOVA

即使只有 1,000 个样本,我也没有发现平均值有任何显着差异。

t.test(data1$s, data2$s)
  Welch Two Sample t-test

data:  data1$s and data2$s
t = -1.4469, df = 1017.9, p-value = 0.1482
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -37.657822   5.692622
sample estimates:
mean of x mean of y 
 125.3137  141.2963

使用 5,000 个样本:

data2 <- sample_n(data1, 5000) # make statistics work for you -- sample the data
t.test(data1$s, data2$s)
  Welch Two Sample t-test

data:  data1$s and data2$s
t = -1.0653, df = 5513.7, p-value = 0.2868
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -14.736700   4.359704
sample estimates:
mean of x mean of y 
 125.3137  130.5022
t.test(data1$dt, data2$dt)
  Welch Two Sample t-test

data:  data1$dt and data2$dt
t = -0.069479, df = 5507.8, p-value = 0.9446
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -18.39645  17.13709
sample estimates:
mean of x mean of y 
 515.6206  516.2503
t.test(data1$dip, data2$dip)
  Welch Two Sample t-test

data:  data1$dip and data2$dip
t = 1.2044, df = 5536.3, p-value = 0.2285
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.6268062  2.6241395
sample estimates:
mean of x mean of y 
 126.6667  125.6680

当然,您可以使用更多/差异统计数据来验证您的样本,具体取决于您想要走多远。您还可以预先估计功效曲线以确定样本量。

对于 10,000 个样本,在我的笔记本电脑上完成大约需要 3 分钟。有 1,000 个样本,它立即完成。

【讨论】:

  • 这将减少 R 中向量所需的内存?
  • @user5359531 绝对!至少增加 10 倍。它通过采样使各个方面的尺寸变小。我得到了与 OP 相同的错误,包含完整的数据,并且在任何合理的样本量下都没有错误。否则我将无法获得该结果图(无论如何它都不太漂亮)。
  • 这并没有减少向量的内存需求,只是制作了一个不同的更小的向量
  • @user5359531 ??嗯,不,它也绝对减少了有问题的向量的大小,从数据科学/统计和整洁数据的角度来看,这是最佳实践。
  • @Hack-R 我现在正在将原始数据集与子采样数据集进行比较,已经用完 10,000 个,我看到了一些非常显着的差异。我是否正确假设(不熟悉 sample_n)正在发生的事情是它正在制作一个包含 10000 个观测值的新数据框,而不是完整的 48,000 个?所以它并没有提高内存效率,只是在更小的数据上运行它,因此需要更少的内存?对吗?
猜你喜欢
  • 2017-09-07
  • 2018-01-28
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2011-01-22
  • 2021-06-17
  • 2021-11-20
  • 2013-07-07
相关资源
最近更新 更多