You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

卡方模拟内存分配错误:无法分配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:13:18