Lentidão com read.dbc ou read.dbf para arquivos do DATASUS

Olá pessoal. EU uso muito o pacote microdatasus para baixar dados diretamente do ftp do Ministério da Saúde. Os arquivos vem em dbc e são convertidos pelo pacote read.dbc (construído por uma pesquisadora chamada Daniela Petruzalec). Contudo, eu percebi que leitura de arquivos DBC com o read.dbc ficou muito lenta nas versões mais novas do R (percebi isso comparando a 4.1.1 com a 4.2.1).

O problema está na minha máquina ou tem haver realmente com o pacote?

library(tictoc)
tic(“Abrindo base pelo MicrodataSUS”)
db_prof ← microdatasus::fetch_datasus(year_start = 2015, month_start = 12,
year_end = 2015, month_end = 12,
uf = c(“AL”), information_system = “CNES-PF”)
toc()
Abrindo base pelo MicrodataSUS: 100.91 sec elapsed

tic(“Abrindo base diretamente pelo read.dbc”)
db_prof ← read.dbc::read.dbc(“data/PFBA1512.dbc”)
toc()

Abrindo base diretamente pelo read.dbc: 96.6 sec elapsed

R version 4.1.1 (2021-08-10) – “Kick Things”

library(tictoc)
tic(“Abrindo base pelo MicrodataSUS”)
db_prof ← microdatasus::fetch_datasus(year_start = 2015, month_start = 12,

  •                                            year_end = 2015, month_end = 12,
    
  •                                   uf = c("AL"), information_system = "CNES-PF")
    

Your local Internet connection seems to be ok.
DataSUS FTP server seems to be up. Starting download…
trying URL ‘ftp://ftp.datasus.gov.br/dissemin/publicos/CNES/200508_/Dados/PF/PFAL1512.dbc
downloaded 2.1 MB

Warning message:
In utils::download.file(file, temp, mode = “wb”) :
the ‘wininet’ method is deprecated for ftp:// URLs

toc()
Abrindo base pelo MicrodataSUS: 2.92 sec elapsed

tic(“Abrindo base diretamente pelo read.dbc”)
db_prof ← read.dbc::read.dbc(“data/PFAL1512.dbc”)
toc()
Abrindo base diretamente pelo read.dbc: 1.37 sec elapsed

Oi Rafael.

Estranho esse comportamento aí. Fiz um teste com seu código no meu pc com R 4.2.1:

Abrindo base pelo MicrodataSUS: 6.468 sec elapsed
Abrindo base diretamente pelo read.dbc: 4.171 sec elapsed

> sessionInfo() R version 4.2.1 (2022-06-23) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Linux Mint 20.3

Matrix products: default
BLAS/LAPACK: /opt/OpenBLAS/lib/libopenblas_haswellp-r0.3.20.so

locale:
[1] LC_CTYPE=pt_BR.UTF-8 LC_NUMERIC=C LC_TIME=pt_BR.UTF-8
[4] LC_COLLATE=pt_BR.UTF-8 LC_MONETARY=pt_BR.UTF-8 LC_MESSAGES=pt_BR.UTF-8
[7] LC_PAPER=pt_BR.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] tictoc_1.0.1

loaded via a namespace (and not attached):
[1] rstudioapi_0.13 magrittr_2.0.3 tidyselect_1.1.2 R6_2.5.1
[5] rlang_1.0.4 fansi_1.0.3 dplyr_1.0.9 tools_4.2.1
[9] microdatasus_1.4.5 utf8_1.2.2 cli_3.3.0 DBI_1.1.3
[13] assertthat_0.2.1 tibble_3.1.8 lifecycle_1.0.1 purrr_0.3.4
[17] vctrs_0.4.1 bitops_1.0-7 RCurl_1.98-1.8 curl_4.3.2
[21] glue_1.6.2 compiler_4.2.1 pillar_1.8.0 read.dbc_1.0.5
[25] generics_0.1.3 lubridate_1.8.0 foreign_0.8-82 pkgconfig_2.0.3

Quando esses arquivos são extraídos diretamente da FTP, deve-se levar em consideração a velocidade da internet.

Eu retirei os dados do SIA utilizando um estratégia de primeiro baixar os dados para uma pasta temporária, mas já fazendo os filtros na base (por exemplo, eu queria o número de consultas por sexo e faixa de idade por município) e em segundo lugar, criando uma função para ler os dados e já empilhando um abaixo do outro, inclusive com uso do pacote furrr para tentar paralelizar. Isso reduziu bastante o tempo para construir essas bases.

Oi! Você poderia compartilhar a query que utilizou para aplicar os filtros na base?

Obrigada!

Não entendi Mariana. Pode ser mais específica?

Oi, Rafael!
Na verdade, eu estava pedindo ao Gerrio_Barbosa, mas a resposta foi ao tópico e não diretamente à resposta dele, me desculpe.
Gostaria de saber como ele aplicou os filtros antes de subir para o R. Eu criei uma solução, há um tempo, para fazer essa leitura automática a partir dos bancos em uma pasta específica, mas gostaria, na verdade, de uma solução para selecionar as variáveis no momento da leitura das bases, para diminuir o tempo e agilizar o processo.
As funções que tentei, até agora, de loop, não têm funcionado.