Manipulação de grandes bases de dados no R

Oi, pessoal. Tudo bem?

Tenho usado o R para fazer algumas análises de dados. Quando você trabalha com uma grande base de dados (50 milhões de linhas, por exemplo), até certo ponto dá para importar o arquivo usando a função data.table::fread() e também já selecionar apenas as colunas de interesse.

Mas e quando os arquivos são cada vez maiores? E depois ainda precisamos cruzar com outros arquivos tão grandes quanto? Quais soluções vocês sugerem no R para lidar com um CSV de 4GB?

2 Curtidas

Oi @gabriela, para volumes de dados muito grande, eu indicaria armazená-los e consultá-los com um banco de dados, como o SQL. Você pode usar inclusive usar o R para lidar com o banco, mas assim “terceiriza” o trabalho pesado para uma tecnologia que foi feita exclusivamente para isso.

Neste benchmark, você encontra um comparativo de perfomance entre R e SQL. Vou colar abaixo a conclusão do autor.

First, while R performs some things with lightning speed and some other things quite slowly, SQL shows a remarkably stable performance at 750 to 1300 microseconds. This stable speed performance is not influenced by whether the data base resides on disk or in memory. So, dealing with data bases via SQL is not just stable in terms of data storage and access but also in terms of speed. R can get slow with more complicated queries while SQL keeps on performing well.

2 Curtidas

Uma coisa que estou usando muito essa semana e gostando é o pacote dbplyr onde você consegue fazer querys em um banco de dados sql com a síntese do tidyverse. Acaba que você tira um dia (ou um pouco mais) para colocar suas bases em um banco de dados sql (ou posgres ou BigQuery) e nos outros dias você trabalha como faz normalmente em R, inclusive fazendo joins que permitem você cruzar com outra base, só que no fundo vai tá rolando tudo no banco de dados.

Aqui tem um tutorial.

5 Curtidas

Tenta o pacote ff. Ele carrega os arquivos no disco em vez da memória RAM.

2 Curtidas

Fiz uns testes recentes aqui com a base do ENEM (3,2 GB) em um computador com 8 GB de memória RAM. No R, tentei abrir com o fread e o vroom, mas não tive muito sucesso com ambos. Daí fui direto para o SQL e consegui bom resultado com o MySQL. Compartilhando aqui os passos que fiz, caso seja útil para outras pessoas:

  1. No terminal, gerei uma amostra da base (head -n 1000 MICRODADOS_ENEM_2019.csv > sample.csv)
  2. Usei o csvsql para gerar um código SQL com o esquema da base: csvsql -i mysql -e ISO8859 -I sample.csv > enem.sql
  3. Completei este código com os comandos de LOAD DATA para carregar os dados.

O resultado está aqui: https://github.com/belisards/load_enem/blob/master/load.sql

Depois, basta criar uma base de dados e importar os dados via terminal: mysql -vu nome_do_usario -p NOME_DA_BASE < load.sql

Com os dados carregados em uma base SQL, então, dá para usar Python, R ou outra linguagem pra acessar. Para quem não é familiar com linguagens de programação, o DBeaver é uma alternativa para lidar com bases de dados via interface gráfica.

1 Curtida