卡方模拟内存分配错误:无法分配134217728Tb内存块
求助:自定义SSAS函数处理小数据集时出现超大内存分配错误
我最近在运行自己写的SSAS函数处理数据时,遇到了一个特别诡异的问题——明明我的数据只有800行3列,却一直弹出内存块分配错误,说要分配134217728Tb的内存,这显然不可能啊!但只要把数据缩减到300行,函数就能正常运行了。更奇怪的是,我用超过1000行的测试数据跑这个函数,完全没问题,这就让我摸不着头脑了。
先贴一下我的SSAS函数代码:
SSAS <- function(x, conf.int = 0.95, B = 10000) { x <- as.matrix(x) nr <- nrow(x) nc <- ncol(x) sr <- rowSums(x) sc <- colSums(x) n <- sum(x) E <- outer(sr, sc, "*")/n dimnames(E) <- dimnames(x) tmp <- .Call(stats:::C_chisq_sim, sr, sc, B, E) obs <- sum(sort((x - E)^2/E, decreasing = TRUE))/n sim <- tmp/n p0 <- (1 - conf.int)/2 return(c(obs, quantile(sim, p0), quantile(sim, 1 -p0))) }
报错信息是这样的:
Error in FUN(X[[i]], ...) : cannot allocate memory block of size 134217728 Tb
下面是能正常运行的测试数据调用代码,以及用到的splitmfd函数:
cap <- read.table("http://pbil.univ-lyon1.fr/R/donnees/mfdcapreolus.txt", h = T) l1 <- splitmfd(cap) w <- matrix(unlist(lapply(l1, SSAS)), ncol = 3, byrow = T)
splitmfd <- function(mfd) { loca1 <- function(x) { x <- t(x[, 1:2]) dimnames(x) <- list(c("mal", "fem"), as.character(1:ncol(x))) x } l0 <- split(mfd, mfd$mon) lapply(l0, loca1) }
我的数据是按PRENURS、NURSE、POSTNURSE三个周期拆分的,数据样例如下:
> head(groups) X n_male_mat n_fem_mat PERIOD 1 1 0 22 PRENURS 2 2 0 14 PRENURS 3 3 4 19 PRENURS 4 4 1 0 PRENURS 5 5 0 21 NURSE 6 6 0 11 NURSE
有没有大佬能帮我看看这到底是哪里出问题了?为什么小数据集反而爆内存,测试的大数据集却没事?
内容的提问来源于stack exchange,提问作者Lydia Katsis
相关产品推荐
相关产品推荐

