我正在使用acs软件包下载美国所有都会区的失业数据。
我们首先从人口普查网站下载msa代码,加载.csv,子集所有都会区,然后使用geo.make使用acs包制作新的地理集对象:
library(acs)
# read msa codes
data = read.csv("C:/dir_here/msa_codes.csv", header = TRUE, sep = ",",stringsAsFactors = FALSE)
# subset data for metro only
data_metro = subset(data, Metropolitan.Micropolitan.Statistical.Area == "Metropolitan Statistical Area")
# Obtain Tracs for all US states (acs package)
all_geo_trac = list()
for (i in 1:nrow(data_metro)) {
all_geo_trac[[i]] = geo.make(msa=data_metro$CBSA.Code[i])
}
现在,我们有了所需的都会区列表-接下来是获取每个都会区的人口普查数据。这是我们遍历每个地理集并从人口普查网站下载相应失业数据的部分。我为此编写了一个for循环,但是我在大约100次迭代中耗尽了内存。当这部分运行时,我可以看到任务管理器上的内存使用率逐渐增加直至达到最大值。 for循环可能在每次迭代中都在复制吗?继承人代码:
# Obtain unemployment data
options( warn = -1 ) # warnings off
#options(warn=0) # warnings on
unemployment_2016_out_df = list()
temp = list()
#gcinfo(TRUE)
for (i in 1:length(all_geo_trac)){
temp[[i]] <- acs.fetch(endyear = 2016, span = 1, geography = all_geo_trac[[i]], table.number = "B23025", col.names = "pretty")
location = temp[[i]]@geography[1]
total = temp[[i]]@estimate[,c("Employment Status for the Population 16 Years and Over: Total:")]
total_unemployed = temp[[i]]@estimate[,c("Employment Status for the Population 16 Years and Over: In labor force: Civilian labor force: Unemployed")]
#unemployment_2016_out_df[[i]] = data.frame(NAME = location, total_2016 = total, total_unemployed_2016 = total_unemployed)
unemployment_2016_out_df[[i]] = cbind(location,total,total_unemployed)
print(unemployment_2016_out_df[[i]])
cat("iteration",i)
#gc()
#Sys.sleep(10)
}
有人可以看到我如何用不同的方式写这个吗?我用于在迭代100上存储dfs的实际temp[[[i]]
列表不会超过字节,与输出列表相同,unemployment_2016_out_df[[i]]
的大小不会超过1mb。因此,这些项目不占用大量内存,这不足为奇。
我唯一的结论是与普查api接口的acs包-也许for循环中的代码没有在每次迭代中释放内存。
我是用内存有效的方式编写代码还是提出其他建议?