【问题标题】:Cannot allocate vector in R of size 11.8 Gb [duplicate]无法在大小为 11.8 Gb 的 R 中分配向量 [重复]
【发布时间】:2014-02-18 06:21:03
【问题描述】:

我收到此错误“无法在大小为 11.8 Gb 的 R 中分配向量”,因为我的桌面有 8 GB 内存,而我使用的矩阵大小为 3000x52128。

这里有什么解决方案可以避免这种内存错误吗? 即使我尝试将矩阵的大小减小为 1500x52128,我也得到了与 11.8 Gb 相同的错误和相同的大小。

那我该怎么办? 只有一种解决方案是在具有 16 GB 内存的计算机上工作?

补充说明:
运行以下命令时,出现此错误。

svmDS <- read.csv("TrainDataSet_ver1.2.csv");
model<-naiveBayes(as.factor(class)~., data=svmDS)

【问题讨论】:

  • 好吧,请仔细考虑是否需要执行会创建 11.8 GB 向量的操作。您的矩阵并不是很大,因此您的代码有可能会做一些您没有预料到的事情,或者可以以不同的(更高效的)方式实现。
  • 假设 8 字节值(可能是文本?),该矩阵应该约为 1.2GB。您的代码正在做其他事情,正如较小的矩阵没有进行较小的内存分配所清楚地表明的那样。如果您想要一个好的答案,您需要发布更多详细信息。
  • 真的很抱歉各位。我添加了评论
  • 值得注意的是,由于 R 是一个社区项目,您可以打开 naiveBayes 函数并尝试根据您的目的对其进行调整。例如,有一些 R 库允许您处理 RAM 之外(在磁盘上)的数据,因此您可以根据需要编写适合您环境的函数。如果是重大改进,您甚至可以将更改提交给包维护者。

标签: r memory-management


【解决方案1】:

以下功能有助于释放工作区,通过删除工作区中已有的大对象。 这不是您问题的直接解决方案。但它也有帮助。

.ls.objects <- function (pos = 1, pattern, order.by,
                        decreasing=FALSE, head=FALSE, n=5) {
    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.prettysize <- napply(names, function(x) {
                           capture.output(print(object.size(x), units = "auto")) })
    obj.size <- napply(names, object.size)
    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.prettysize, obj.dim)
    names(out) <- c("Type", "Size", "PrettySize", "Rows", "Columns")
    if (!missing(order.by))
        out <- out[order(out[[order.by]], decreasing=decreasing), ]
    if (head)
        out <- head(out, n)
    out
}

lsos <- function(..., n=10) {
    .ls.objects(..., order.by="Size", decreasing=TRUE, head=TRUE, n=n)
}

lsos()

它会向您显示工作区中的对象列表,并偶尔显示rm() 其中一些。

【讨论】:

猜你喜欢
  • 2019-10-05
  • 2021-04-03
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多