Недостаточно памяти - пакет ACS / R - PullRequest
0 голосов
/ 12 ноября 2018

Я использую пакет 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 не освобождает память на каждой итерации.

Я пишу код эффективным способом памяти или какие-либо другие предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...