knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
library(microdatasus)

Download timeout

Por padrão, o R espera que um arquivo seja baixado em até 60 segundos. Ao baixar algum arquivo muito grande ou com uma conexão com a Internet lenta, o tempo necessário para download será maior. Neste caso, você verá uma mensagem de warning semelhante a esta:

1: In utils::download.file(file, temp, mode = "wb", method = "libcurl") :
  downloaded length 12260742 != reported length 30474112
2: In utils::download.file(file, temp, mode = "wb", method = "libcurl") :
  URL 'ftp://ftp.datasus.gov.br/dissemin/publicos/SINAN/DADOS/FINAIS/DENGBR10.dbc': Timeout of 60 seconds was reached

Para corrigir isto, é bem simples: aumente o tempo de tolerância do R para downloads. Exemplo: tolerância de 2 minutos.

options(timeout = 120)

Download de muitos dados

O download dos dados através do pacote é realizado em memória. Isto significa que cada arquivo baixado do DataSUS é lido e armazenado na memória RAM do computador. Caso você esteja baixando muitos arquivos, para vários estados e anos, você irá precisar de mais memória RAM disponível.

Um modo de contornar este problema é a realizar o download e armazenar os resultados em um banco de dados, como SQLite, DuckDB ou outro. Abaixo segue um exemplo de como fazer isso.

Pacotes

library(microdatasus)
library(tidyverse)
library(dbplyr)
library(DBI)
library(RSQLite)

Cria conexão com o banco de dados

conn <- dbConnect(RSQLite::SQLite(), "sih.SQLite")

Realiza download e pré-processamento dos dados em loop

anos <- c(2019, 2020)
meses <- 1:12
ufs <- c("AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", 
         "GO", "MA", "MT", "MS", "MG", "PA", "PB", "PR", "PE", 
         "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SP", "SE", 
         "TO")
for(ano in anos){
  for(mes in meses){
    for(uf in ufs){
      # Baixa o dado para um ano, mês e UF específico
      tmp <- fetch_datasus(
        year_start = ano, year_end = ano, 
        month_start = mes, month_end = mes,
        uf = uf, information_system = "SIH-RD"
      )

      # Pré-processamento dos dados
      tmp <- process_sih(data = tmp)

      # Escreve na tabela "sih" no banco de dados, 
      # apensando os dados de cada ano e mês
      dbWriteTable(conn = conn, name = "sih", value = tmp, append = TRUE)

      # Remove a tabela temporária
      rm(tmp)
    }
  }
}

Exemplo de consulta ao banco de dados,

Uma tabela de quantidade de registrosm, por sexo e causa básica

tbl(conn, "sih") %>%
  group_by(SEXO, COMPLEX) %>%
  summarise(freq = n()) %>%
  ungroup() %>%
  collect()


rfsaldanha/microdatasus documentation built on April 13, 2024, 2:25 p.m.