首页 > 解决方案 > 无法分配大小为 n 的向量错误 - 在 R 中导入房利美单身家庭贷款数据

问题描述

我一直在尝试在 R 中加载房利美贷款数据,这些数据可以从他们的网站 ( https://loanperformancedata.fanniemae.com/lppub/index.html# ) 以“txt”格式获得我正在使用数据导入他们提供的代码,但我遇到了一个错误“无法分配大小为 n mb 的向量”我现在只尝试读取和 rbind 4 个文件(每个 600-700mb 左右)但需要为许多人这样做更多的。我正在使用具有8GB RAM64 位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")
                        }

标签: rmemory-managementlarge-datadata-import

解决方案


正如评论中已经确定的那样,您的问题是您的可用内存不足。这可能会让您感到惊讶,因为您拥有 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 数据库中。前进的方法是逐个读取文件并将数据写入数据库。这样您就可以在需要时查询所需的数据。或者获得更多内存。这也会有所帮助。


推荐阅读