使用pxR包read.px读取PC-Axis文件时C栈溢出错误的解决方法
解决R中read.px函数的C栈溢出问题
可行解决方法
1. 调整系统C栈大小(Unix/Linux/macOS)
在启动R前,在终端执行命令提升栈限制:
ulimit -s 65536 # 将栈大小设为64MB,可根据需求调整数值
完成后再启动R运行代码即可。若需永久生效,可将该命令添加到shell配置文件(如~/.bashrc或~/.zshrc)中。
2. 使用更高效的替代包
pxR包的read.px递归逻辑易触发栈溢出,推荐改用pxweb包处理PX文件:
# 安装pxweb包 install.packages("pxweb") # 读取PX文件并转为tibble library(pxweb) library(tibble) tbl_census_2018 <- pxweb_read("data/census_2018.px") %>% as_tibble()
3. 重写read.px的递归逻辑(仅限必须使用pxR的场景)
若必须用pxR包,需将read.px中的递归解析改为迭代实现。例如找到递归处理节点的代码,替换为循环遍历:
# 示例:将递归解析节点的逻辑改为迭代 # 原递归逻辑(示例) parse_nodes <- function(node) { if (is_leaf(node)) return(node) lapply(node$children, parse_nodes) } # 修改后的迭代逻辑 parse_nodes <- function(root_node) { stack <- list(root_node) result <- list() while (length(stack) > 0) { node <- stack[[length(stack)]] stack <- stack[-length(stack)] if (is_leaf(node)) { result <- c(result, list(node)) } else { stack <- c(stack, node$children) } } result }
修改后重新定义read.px函数,再执行读取操作。
4. 提升R的内存分配上限
作为辅助措施,增加R可用内存:
- Windows系统:
memory.limit(size = 16384) # 设置为16GB,可根据自身内存调整数值
- Unix/Linux/macOS系统:
options(mem.max_size = 16e9) # 设置为16GB
内容的提问来源于stack exchange,提问作者Ed_Gravy
相关产品推荐
相关产品推荐

