Я использую пакет 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])
}
Теперь у нас есть список районов метрополитена, которые мы хотим - далее нужно взять данные переписи для каждой зоны метро.Это та часть, где мы перебираем каждый geo.set и загружаем соответствующие данные о безработице с веб-сайта переписи.Я написал цикл 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)
}
Может кто-нибудь увидеть, как я могу написать это по-другому?Фактический список temp[[[i]]
, который я использую для хранения dfs на итерации 100, не проходит мимо байтов, так же как и со списком вывода, unemployment_2016_out_df[[i]]
размер не превышает 1 МБ.Таким образом, эти предметы не требуют большой памяти, что неудивительно.
Мой единственный вывод заключается в том, что пакет acs взаимодействует с api переписи - возможно, код во время цикла for не освобождает память на каждой итерации.
Я пишу код эффективным способом памяти или какие-либо другие предложения?