r - 无法分配大小为 n 的向量错误 - 在 R 中导入房利美单身家庭贷款数据
问题描述
我一直在尝试在 R 中加载房利美贷款数据,这些数据可以从他们的网站 ( https://loanperformancedata.fanniemae.com/lppub/index.html# ) 以“txt”格式获得我正在使用数据导入他们提供的代码,但我遇到了一个错误“无法分配大小为 n mb 的向量”我现在只尝试读取和 rbind 4 个文件(每个 600-700mb 左右)但需要为许多人这样做更多的。我正在使用具有8GB RAM和64 位RStudio 的笔记本电脑。关于做什么的任何建议?该代码与 doMC/doParallel 一起使用“fread”,据我所知,这是尽可能高效的。
这是代码:
library(doMC)
registerDoMC(30)
Performance_Data <- foreach(k=1:numberofcores, .inorder=FALSE, .combine=rbind,
.packages=c("data.table")) %do% {
Data_P<- fread(Performance[k], sep = "|", colClasses=Performance_ColClasses, showProgress=TRUE)
setnames(Data_P, Performance_Variables)
setkey(Data_P, "LOAN_ID")
}
解决方案
正如评论中已经确定的那样,您的问题是您的可用内存不足。这可能会让您感到惊讶,因为您拥有 8 GB 的总 RAM。但是,对于超过 100MB 的 txt 文件,这可能根本不够,即使您不并行处理(这会导致额外的内存开销)。
我有一个我最近尝试过的例子。由于您描述的数据在没有帐户的情况下无法使用,因此在此处显示可能更有意义:
library("data.table")
download.file(url = "http://download.geonames.org/export/dump/allCountries.zip",
destfile = "allCountries.zip",
mode = "wb",
cacheOK = FALSE,
extra = character())
unzip(zipfile = "allCountries.zip")
前几行只是下载并解压缩包含数据的 .txt。请注意,解压后的.txt
文件大小为 1.4 GB。
geonames <- fread("allCountries.txt",
quote = "",
sep = "\t",
col.names = c(
"geonameid",
"name",
"asciiname",
"alternatenames",
"latitude",
"longitude",
"feature class",
"feature code",
"country code",
"cc2",
"admin1 code",
"admin2 code",
"admin3 code",
"admin4 code",
"population",
"elevation",
"dem",
"timezone",
"modification date"
))
format(object.size(geonames), units = "GiB")
#> [1] "2.9 Gb"
如您所见,该文件在读入 R 后大小增加了一倍多。要读取四个 700mb 文件,您需要 5.6GB 可用 RAM。在 Windows 中,这可能是一个挑战,具体取决于后台运行的其他内容。您可以考虑逐个读取文件,将它们保存为 .RDS 文件,然后将它们合并在一起。但这不会改变您不能一次在 R 中打开所有数据的事实。
我的建议是查看dbplyr
包并将您的数据保存在例如 SQLite 数据库中。前进的方法是逐个读取文件并将数据写入数据库。这样您就可以在需要时查询所需的数据。或者获得更多内存。这也会有所帮助。
推荐阅读
- javascript - Vue 父组件无法捕获子组件发出的事件
- javascript - 如何检索函数返回的值?
- excel - 从 VB.Net 将多个系列数据添加到 Excel 图表
- sql - 如何使用“案例”标记一列中具有相同值的 2 个不同行
- javascript - 满足条件时禁用按键事件侦听器
- bash - 如何通过多个键查找匹配项并提取连续两行匹配项的值?
- python - 在 3D 动画中在摄像机前绘制新球体
- php - PHP - 需要使用来自 API 的 3 个非常不同的 id 来获得相同的东西
- python - 使用 for 循环从单个字典条目更新多个列表
- javascript - 从另一个分层对象创建分层对象