Trabalhar com muitos dados

Caros, Estou trabalhando com os dados dos censos populacionais de 2000 e 2010. A minha dificuldade é o volume de dados, pois cada censo tem aproximadamente 20 milhões de linhas. Considerando os dados estão em arquivos .csv, um único aquivo de 12 GB para o censo de 2010 e um arquivo para cada estado no censo de 2000, que totalizam 11 GB. Utilizo um notebook com processador Intel Core i5 2410M, 8 GB de ram com 3 GB de SWAP e o sistema operacional é o Arch Linux. Tenho quatro dúvidas que estão abaixo em meio da minha explicação sobre os problemas que venho enfrentando. Para ler os arquivos .csv conheço as seguintes opções: a) trabalhar com um banco de dados relacional. R.: estou com um problema com o postgresql que ainda não tenho solução, portanto, essa alternativa esta descartada no momento. b) utilizar o sqldf. R.: acredito que o sqldf não é eficiênte para trabalhar com arquivos grandes, o processo é encerrado antes de concluir a operação. Exemplo:
library(sqldf) read.csv.sql('censo00ba1.csv', sql = "select V0102 from file", header = TRUE, sep = ",") [ reached getOption("max.print") -- omitted 1498127 rows ] Warning messages: 1: closing unused connection 4 (censo00ba1.csv) 2: closing unused connection 5 (censo00ba1.csv)
1ª dúvida: isso sempre acontece com o sqldf, ou alguém consegue utilizá-lo com para ler arquivos grandes? c) utilizar o comando cut e grep do Linux/Mac para filtrar os dados e ter um arquivo .csv menor, dessa forma é possível ler o arquivo pelo comando do R, read.csv(). R.: utilizei essa opção. Exemplo: cut -d',' -f1,4,5,6,10,79,81,84,91,92,95,97,111,113,114,149,150,188 br2010.csv > br2010b.csv Uma vez superada a dificuldade da importação dos dados deletei algumas coisas e fiquei com três arquivos com as seguintes dimensões:
dim(cs);dim(cs2000);dim(cs2010) [1] 6077327 23 # censos 2000 e 2010 [1] 2865716 23 # censo 2000 [1] 3211611 23 # censo 2010
Quanto ao processamento: d) Consigo rodar regressão simples para o censo de 2000 e para o censo de 2010 separadamente, como segue exemplo:
ma <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2000) mb <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2010)
mas não consigo rodar o mesmo modelo para os dados do arquivo 'cs', que tem 6.077.327 linhas, que é censo 2000 mais censo 2010. Pois, aparece a seguinte mensagem de erro:
mc <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF) + factor(ano), data=cs) Error: cannot allocate vector of size 2.0 Gb
2ª dúvida: qual procedimento posso utilizar para solucionar esse problema de rodar a regressão das 6.077.327 observações? Um amigo indicou aumentar a memória SWAP, essa é uma boa opção? 3ª dúvida: ao realizar um processo que demanda muita memória ram o R não consegue realizar outro processo pesado em seguida, pois a memória fica ocupada. Exemplo, ao rodar uma regressão em uma base de dados com 3 milhões de linhas eu não consigo realizar outra regressão pq a memória fica cheia. Dúvida, tem como 'limpar' os dados da memória para poder realizar outros cálculos? 4ª dúvida: trabalhar com paralelismo pode auxiliar nesse tipo de processamento? Grato pela atenção. Roney

Trabalho com os dados dos censos usando R. A solução para processamento paralelo, big data, etc., usando R é o Revolution Analytics ( http://www.revolutionanalytics.com/). abs 2012/10/16 Roney Fraga <roneyfraga@gmail.com>
Caros,
Estou trabalhando com os dados dos censos populacionais de 2000 e 2010. A minha dificuldade é o volume de dados, pois cada censo tem aproximadamente 20 milhões de linhas. Considerando os dados estão em arquivos .csv, um único aquivo de 12 GB para o censo de 2010 e um arquivo para cada estado no censo de 2000, que totalizam 11 GB. Utilizo um notebook com processador Intel Core i5 2410M, 8 GB de ram com 3 GB de SWAP e o sistema operacional é o Arch Linux. Tenho quatro dúvidas que estão abaixo em meio da minha explicação sobre os problemas que venho enfrentando.
Para ler os arquivos .csv conheço as seguintes opções:
a) trabalhar com um banco de dados relacional. R.: estou com um problema com o postgresql que ainda não tenho solução, portanto, essa alternativa esta descartada no momento.
b) utilizar o sqldf. R.: acredito que o sqldf não é eficiênte para trabalhar com arquivos grandes, o processo é encerrado antes de concluir a operação. Exemplo:
library(sqldf) read.csv.sql('censo00ba1.csv', sql = "select V0102 from file", header = TRUE, sep = ",") [ reached getOption("max.print") -- omitted 1498127 rows ] Warning messages: 1: closing unused connection 4 (censo00ba1.csv) 2: closing unused connection 5 (censo00ba1.csv)
1ª dúvida: isso sempre acontece com o sqldf, ou alguém consegue utilizá-lo com para ler arquivos grandes?
c) utilizar o comando cut e grep do Linux/Mac para filtrar os dados e ter um arquivo .csv menor, dessa forma é possível ler o arquivo pelo comando do R, read.csv(). R.: utilizei essa opção. Exemplo: cut -d',' -f1,4,5,6,10,79,81,84,91,92,95,97,111,113,114,149,150,188 br2010.csv > br2010b.csv
Uma vez superada a dificuldade da importação dos dados deletei algumas coisas e fiquei com três arquivos com as seguintes dimensões:
dim(cs);dim(cs2000);dim(cs2010) [1] 6077327 23 # censos 2000 e 2010 [1] 2865716 23 # censo 2000 [1] 3211611 23 # censo 2010
Quanto ao processamento:
d) Consigo rodar regressão simples para o censo de 2000 e para o censo de 2010 separadamente, como segue exemplo:
ma <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2000) mb <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2010)
mas não consigo rodar o mesmo modelo para os dados do arquivo 'cs', que tem 6.077.327 linhas, que é censo 2000 mais censo 2010. Pois, aparece a seguinte mensagem de erro:
mc <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF) + factor(ano), data=cs) Error: cannot allocate vector of size 2.0 Gb
2ª dúvida: qual procedimento posso utilizar para solucionar esse problema de rodar a regressão das 6.077.327 observações? Um amigo indicou aumentar a memória SWAP, essa é uma boa opção?
3ª dúvida: ao realizar um processo que demanda muita memória ram o R não consegue realizar outro processo pesado em seguida, pois a memória fica ocupada. Exemplo, ao rodar uma regressão em uma base de dados com 3 milhões de linhas eu não consigo realizar outra regressão pq a memória fica cheia. Dúvida, tem como 'limpar' os dados da memória para poder realizar outros cálculos?
4ª dúvida: trabalhar com paralelismo pode auxiliar nesse tipo de processamento?
Grato pela atenção. Roney
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Diogo Ferrari University of San Paulo (USP) Faculty of Philosophy, Languages, Literature and Human Sciences (FFLCH) Department of Political Science (DCP) San Paulo/SP - Brazil E-mail: diogo.ferrari@usp.br Open Source! Use R! Use Linux! "A vida é a arte de tirar conclusões suficientes de dados insuficientes"

Roney, eu escrevi um exemplo abaixo baseado em scripts que eu tenho aqui. Não sei se vai servir no seu caso, mas é um caminho. Essencialmente, para ler os dados, as opções apresentadas são os pacotes sqldf e ff (e ffbase para algumas funções úteis) e biglm para a regressão. Att., Rubem library(sqldf) library(biglm) library(ffbase) # Criando dados fictícios id <- 1:1e5 xy <- matrix(rnorm(11e5),1e5,11) dat0 <- cbind(id, xy) dat <- as.data.frame(dat0) names(dat) <- c('id', 'y', paste('x',1:10,sep="")) write.csv(dat, 'dat.teste.csv', row.names=F) ## Passando os dados para um formato de base de dados sqldf("attach dbtest as new") read.csv.sql("dat.teste.csv", "create table main as select * from file", dbname="dbtest") ## Lendo os dados via query e ajustando modelo de regressão drv<-dbDriver("SQLite") con<-dbConnect(drv, dbname='dbtest') dbListTables(con) # "head()" dbGetQuery(con, "select * from main limit 6") m0<-bigglm(y~x1+x2, data=con, tablename='main', chunksize=5e4) summary(m0) dbDisconnect(con) ## Alternativamente: Lendo de um arquivo CSV cc<-c('factor',rep('numeric',11)) tes.dat<-read.table.ffdf(file='dat.teste.csv', FUN='read.csv', colClasses=cc,na.strings="") # Subconjunto de dados tes.dat2<-subset(tes.dat, tes.dat$y > 1)

Roney, quanto à sua 3a questão, talvez isso possa ajudar a liberar a memória 1) gc(reset = TRUE) # para o R liberar a memória para o SO 2) no terminal: sudo sync; echo 3 > /proc/sys/vm/drop_caches (confira com free -m antes e depois desse comando) Isso vai liberar o cache da memória RAM e da swap. Você pode fazer um shell script para automatizar o (2). Mais detalhes sobre o drop_caches: http://www.linuxinsight.com/proc_sys_vm_drop_caches.html http://people.arsc.edu/~kcarlson/software/man/drop_caches.html []s, --- Fernando Mayer Universidade Federal de Santa Catarina - UFSC Departamento de Ecologia e Zoologia - ECZ/CCB URL: http://fernandomayer.github.com e-mail: fernandomayer [@] gmail.com 2012/10/16 Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br>:
Roney,
eu escrevi um exemplo abaixo baseado em scripts que eu tenho aqui. Não sei se vai servir no seu caso, mas é um caminho. Essencialmente, para ler os dados, as opções apresentadas são os pacotes sqldf e ff (e ffbase para algumas funções úteis) e biglm para a regressão.
Att., Rubem
library(sqldf) library(biglm) library(ffbase)
# Criando dados fictícios id <- 1:1e5 xy <- matrix(rnorm(11e5),1e5,11) dat0 <- cbind(id, xy)
dat <- as.data.frame(dat0) names(dat) <- c('id', 'y', paste('x',1:10,sep=""))
write.csv(dat, 'dat.teste.csv', row.names=F)
## Passando os dados para um formato de base de dados sqldf("attach dbtest as new") read.csv.sql("dat.teste.csv", "create table main as select * from file", dbname="dbtest")
## Lendo os dados via query e ajustando modelo de regressão drv<-dbDriver("SQLite")
con<-dbConnect(drv, dbname='dbtest') dbListTables(con)
# "head()" dbGetQuery(con, "select * from main limit 6")
m0<-bigglm(y~x1+x2, data=con, tablename='main', chunksize=5e4) summary(m0)
dbDisconnect(con)
## Alternativamente: Lendo de um arquivo CSV cc<-c('factor',rep('numeric',11)) tes.dat<-read.table.ffdf(file='dat.teste.csv', FUN='read.csv', colClasses=cc,na.strings="")
# Subconjunto de dados tes.dat2<-subset(tes.dat, tes.dat$y > 1)
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Veja os pacotes bigmemory, bigmatrix, entre outros big... Costumo abrir arquivos com 20Gb sem problema de Swap. Valeu! Fábio Mathias Corrêa Universidade Estadual de Santa Cruz Departamento de Ciências Exatas e da Terra - DCET Campus Soane Nazaré de Andrade, km 16 Rodovia Ilhéus-Itabuna CEP 45662-900. Ilhéus-Bahia Tel.: 73-3680-5076 ________________________________ De: Roney Fraga <roneyfraga@gmail.com> Para: R-br <r-br@listas.c3sl.ufpr.br> Enviadas: Terça-feira, 16 de Outubro de 2012 13:41 Assunto: [R-br] Trabalhar com muitos dados Caros, Estou trabalhando com os dados dos censos populacionais de 2000 e 2010. A minha dificuldade é o volume de dados, pois cada censo tem aproximadamente 20 milhões de linhas. Considerando os dados estão em arquivos .csv, um único aquivo de 12 GB para o censo de 2010 e um arquivo para cada estado no censo de 2000, que totalizam 11 GB. Utilizo um notebook com processador Intel Core i5 2410M, 8 GB de ram com 3 GB de SWAP e o sistema operacional é o Arch Linux. Tenho quatro dúvidas que estão abaixo em meio da minha explicação sobre os problemas que venho enfrentando. Para ler os arquivos .csv conheço as seguintes opções: a) trabalhar com um banco de dados relacional. R.: estou com um problema com o postgresql que ainda não tenho solução, portanto, essa alternativa esta descartada no momento. b) utilizar o sqldf. R.: acredito que o sqldf não é eficiênte para trabalhar com arquivos grandes, o processo é encerrado antes de concluir a operação. Exemplo:
library(sqldf) read.csv.sql('censo00ba1.csv', sql = "select V0102 from file", header = TRUE, sep = ",") [ reached getOption("max.print") -- omitted 1498127 rows ] Warning messages: 1: closing unused connection 4 (censo00ba1.csv) 2: closing unused connection 5 (censo00ba1.csv)
1ª dúvida: isso sempre acontece com o sqldf, ou alguém consegue utilizá-lo com para ler arquivos grandes? c) utilizar o comando cut e grep do Linux/Mac para filtrar os dados e ter um arquivo .csv menor, dessa forma é possível ler o arquivo pelo comando do R, read.csv(). R.: utilizei essa opção. Exemplo: cut -d',' -f1,4,5,6,10,79,81,84,91,92,95,97,111,113,114,149,150,188 br2010.csv > br2010b.csv Uma vez superada a dificuldade da importação dos dados deletei algumas coisas e fiquei com três arquivos com as seguintes dimensões:
dim(cs);dim(cs2000);dim(cs2010) [1] 6077327 23 # censos 2000 e 2010 [1] 2865716 23 # censo 2000 [1] 3211611 23 # censo 2010
Quanto ao processamento: d) Consigo rodar regressão simples para o censo de 2000 e para o censo de 2010 separadamente, como segue exemplo:
ma <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2000) mb <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2010)
mas não consigo rodar o mesmo modelo para os dados do arquivo 'cs', que tem 6.077.327 linhas, que é censo 2000 mais censo 2010. Pois, aparece a seguinte mensagem de erro:
mc <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF) + factor(ano), data=cs) Error: cannot allocate vector of size 2.0 Gb
2ª dúvida: qual procedimento posso utilizar para solucionar esse problema de rodar a regressão das 6.077.327 observações? Um amigo indicou aumentar a memória SWAP, essa é uma boa opção? 3ª dúvida: ao realizar um processo que demanda muita memória ram o R não consegue realizar outro processo pesado em seguida, pois a memória fica ocupada. Exemplo, ao rodar uma regressão em uma base de dados com 3 milhões de linhas eu não consigo realizar outra regressão pq a memória fica cheia. Dúvida, tem como 'limpar' os dados da memória para poder realizar outros cálculos? 4ª dúvida: trabalhar com paralelismo pode auxiliar nesse tipo de processamento? Grato pela atenção. Roney _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Curiosidade minha.... Por acaso, o resultado de .Machine$sizeof.pointer e' 4? b 2012/10/16 Roney Fraga <roneyfraga@gmail.com>:
Caros,
Estou trabalhando com os dados dos censos populacionais de 2000 e 2010. A minha dificuldade é o volume de dados, pois cada censo tem aproximadamente 20 milhões de linhas. Considerando os dados estão em arquivos .csv, um único aquivo de 12 GB para o censo de 2010 e um arquivo para cada estado no censo de 2000, que totalizam 11 GB. Utilizo um notebook com processador Intel Core i5 2410M, 8 GB de ram com 3 GB de SWAP e o sistema operacional é o Arch Linux. Tenho quatro dúvidas que estão abaixo em meio da minha explicação sobre os problemas que venho enfrentando.
Para ler os arquivos .csv conheço as seguintes opções:
a) trabalhar com um banco de dados relacional. R.: estou com um problema com o postgresql que ainda não tenho solução, portanto, essa alternativa esta descartada no momento.
b) utilizar o sqldf. R.: acredito que o sqldf não é eficiênte para trabalhar com arquivos grandes, o processo é encerrado antes de concluir a operação. Exemplo:
library(sqldf) read.csv.sql('censo00ba1.csv', sql = "select V0102 from file", header = TRUE, sep = ",") [ reached getOption("max.print") -- omitted 1498127 rows ] Warning messages: 1: closing unused connection 4 (censo00ba1.csv) 2: closing unused connection 5 (censo00ba1.csv)
1ª dúvida: isso sempre acontece com o sqldf, ou alguém consegue utilizá-lo com para ler arquivos grandes?
c) utilizar o comando cut e grep do Linux/Mac para filtrar os dados e ter um arquivo .csv menor, dessa forma é possível ler o arquivo pelo comando do R, read.csv(). R.: utilizei essa opção. Exemplo: cut -d',' -f1,4,5,6,10,79,81,84,91,92,95,97,111,113,114,149,150,188 br2010.csv > br2010b.csv
Uma vez superada a dificuldade da importação dos dados deletei algumas coisas e fiquei com três arquivos com as seguintes dimensões:
dim(cs);dim(cs2000);dim(cs2010) [1] 6077327 23 # censos 2000 e 2010 [1] 2865716 23 # censo 2000 [1] 3211611 23 # censo 2010
Quanto ao processamento:
d) Consigo rodar regressão simples para o censo de 2000 e para o censo de 2010 separadamente, como segue exemplo:
ma <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2000) mb <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2010)
mas não consigo rodar o mesmo modelo para os dados do arquivo 'cs', que tem 6.077.327 linhas, que é censo 2000 mais censo 2010. Pois, aparece a seguinte mensagem de erro:
mc <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF) + factor(ano), data=cs) Error: cannot allocate vector of size 2.0 Gb
2ª dúvida: qual procedimento posso utilizar para solucionar esse problema de rodar a regressão das 6.077.327 observações? Um amigo indicou aumentar a memória SWAP, essa é uma boa opção?
3ª dúvida: ao realizar um processo que demanda muita memória ram o R não consegue realizar outro processo pesado em seguida, pois a memória fica ocupada. Exemplo, ao rodar uma regressão em uma base de dados com 3 milhões de linhas eu não consigo realizar outra regressão pq a memória fica cheia. Dúvida, tem como 'limpar' os dados da memória para poder realizar outros cálculos?
4ª dúvida: trabalhar com paralelismo pode auxiliar nesse tipo de processamento?
Grato pela atenção. Roney
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Uma outra alternativa é usar um banco de dados e integrar. Uso o SQLite e comigo resolveu com grande eficácia o meu problema, além da grande velocidade no processamento dos dados. Em 16/10/2012 13:41, "Roney Fraga" <roneyfraga@gmail.com> escreveu:
Caros,
Estou trabalhando com os dados dos censos populacionais de 2000 e 2010. A minha dificuldade é o volume de dados, pois cada censo tem aproximadamente 20 milhões de linhas. Considerando os dados estão em arquivos .csv, um único aquivo de 12 GB para o censo de 2010 e um arquivo para cada estado no censo de 2000, que totalizam 11 GB. Utilizo um notebook com processador Intel Core i5 2410M, 8 GB de ram com 3 GB de SWAP e o sistema operacional é o Arch Linux. Tenho quatro dúvidas que estão abaixo em meio da minha explicação sobre os problemas que venho enfrentando.
Para ler os arquivos .csv conheço as seguintes opções:
a) trabalhar com um banco de dados relacional. R.: estou com um problema com o postgresql que ainda não tenho solução, portanto, essa alternativa esta descartada no momento.
b) utilizar o sqldf. R.: acredito que o sqldf não é eficiênte para trabalhar com arquivos grandes, o processo é encerrado antes de concluir a operação. Exemplo:
library(sqldf) read.csv.sql('censo00ba1.csv', sql = "select V0102 from file", header = TRUE, sep = ",") [ reached getOption("max.print") -- omitted 1498127 rows ] Warning messages: 1: closing unused connection 4 (censo00ba1.csv) 2: closing unused connection 5 (censo00ba1.csv)
1ª dúvida: isso sempre acontece com o sqldf, ou alguém consegue utilizá-lo com para ler arquivos grandes?
c) utilizar o comando cut e grep do Linux/Mac para filtrar os dados e ter um arquivo .csv menor, dessa forma é possível ler o arquivo pelo comando do R, read.csv(). R.: utilizei essa opção. Exemplo: cut -d',' -f1,4,5,6,10,79,81,84,91,92,95,97,111,113,114,149,150,188 br2010.csv > br2010b.csv
Uma vez superada a dificuldade da importação dos dados deletei algumas coisas e fiquei com três arquivos com as seguintes dimensões:
dim(cs);dim(cs2000);dim(cs2010) [1] 6077327 23 # censos 2000 e 2010 [1] 2865716 23 # censo 2000 [1] 3211611 23 # censo 2010
Quanto ao processamento:
d) Consigo rodar regressão simples para o censo de 2000 e para o censo de 2010 separadamente, como segue exemplo:
ma <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2000) mb <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2010)
mas não consigo rodar o mesmo modelo para os dados do arquivo 'cs', que tem 6.077.327 linhas, que é censo 2000 mais censo 2010. Pois, aparece a seguinte mensagem de erro:
mc <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF) + factor(ano), data=cs) Error: cannot allocate vector of size 2.0 Gb
2ª dúvida: qual procedimento posso utilizar para solucionar esse problema de rodar a regressão das 6.077.327 observações? Um amigo indicou aumentar a memória SWAP, essa é uma boa opção?
3ª dúvida: ao realizar um processo que demanda muita memória ram o R não consegue realizar outro processo pesado em seguida, pois a memória fica ocupada. Exemplo, ao rodar uma regressão em uma base de dados com 3 milhões de linhas eu não consigo realizar outra regressão pq a memória fica cheia. Dúvida, tem como 'limpar' os dados da memória para poder realizar outros cálculos?
4ª dúvida: trabalhar com paralelismo pode auxiliar nesse tipo de processamento?
Grato pela atenção. Roney
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Ok... Comentários específicos para suas perguntas: 1) experimente armazenar a saída do read.csv.sql numa variável... Ex X = read.csv.sql(todos os seus argumentos) Vc verá os warnings, são apenas mensagens de aviso, não erros. Alternativamente, use o sqlite na linha de comando mesmo... E vc pode importar o seu csv diretamente daqui, sem necessitar do sqldf. para regressões, use biglm 2) evite mexer com swap. Use isso apenas como ultimo recurso 3 para auxiliar no garbage collection, ao trabalhar com grandes volumes de dados, remova os objetos desnecessários e, em seguida, use gc(). O R não é mau o suficiente para manter em memória objetos que vc já removeu. Esse recurso é algo do seu sistema operacional, que mantém em cache objetos que vc usou recentemente, para que não precise carregar novamente qdo vc tentar trabalhar naqueles dados de novo. O gc() vai avisar ao sistema operacional que pode limpar a cache, etc etc etc. 4) na real, paralelismo não tem muito como te ajudar nessa tarefa. b On Wednesday, 17 October 2012, Roney Fraga wrote:
Muito obrigado a todos pelas contribuições, já tenho material para estudar algumas semanas.
Benilton, é 64 bit.
.Machine$sizeof.pointer [1] 8
Abraço Roney

Em 17-10-2012 11:01, Benilton Carvalho escreveu:
Ok... Comentários específicos para suas perguntas:
1) experimente armazenar a saída do read.csv.sql numa variável... Ex
X = read.csv.sql(todos os seus argumentos)
Vc verá os warnings, são apenas mensagens de aviso, não erros.
Alternativamente, use o sqlite na linha de comando mesmo... E vc pode importar o seu csv diretamente daqui, sem necessitar do sqldf.
para regressões, use biglm
2) evite mexer com swap. Use isso apenas como ultimo recurso
3 para auxiliar no garbage collection, ao trabalhar com grandes volumes de dados, remova os objetos desnecessários e, em seguida, use gc(). O R não é mau o suficiente para manter em memória objetos que vc já removeu. Esse recurso é algo do seu sistema operacional, que mantém em cache objetos que vc usou recentemente, para que não precise carregar novamente qdo vc tentar trabalhar naqueles dados de novo. O gc() vai avisar ao sistema operacional que pode limpar a cache, etc etc etc.
4) na real, paralelismo não tem muito como te ajudar nessa tarefa.
b
On Wednesday, 17 October 2012, Roney Fraga wrote:
Muito obrigado a todos pelas contribuições, já tenho material para estudar algumas semanas.
Benilton, é 64 bit. > .Machine$sizeof.pointer [1] 8
Abraço Roney
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível. A forma que encontrei de resolver o problema para se trabalhar com grande volumes de dados foi conectando a um banco de dados. No meu caso, estou usando o SQLite com o pacote sqldf.
Pelo menos no meu caso, o ganho de desempenho foi incrível, uma vez que não preciso mais ficar carregando dados, sem falar que a capacidade agora está na casa dos TB. Saudações -- Frederico Steinmetz Alvarez Engenheiro Eletricista e de Produção Mestrando em Engenharia Eólica Laboratório Didático Pedagógico - Mecânica dos Fluidos LDP-FLU Grupo de Mecânica dos Fluidos Ambientais da UFPE Homepage ( www.ufpe.br/mecfluamb/ ) Universidade Federal de Pernambuco - UFPE Departamento de Engenharia Mecânica Fones: (48) 9143-5141 (VIVO) (81) 8885-1105 (OI)

Sim, fazer SQLite via sqldf ou RSQLite ou o próprio sqlite3 na linha de comando dá o mesmo resultado final. A minha sugestão em usar o sqlite3 é que o overhead é bem menor, pois vc trabalha direto na fonte e vc consegue importar csv sem problemas. A solução em R é bonitinha, mas algumas vezes vc pode ter um ganho em fazer diretamente na ferramenta alvo (SQLite). On Wednesday, 17 October 2012, Fred wrote:
Em 17-10-2012 11:01, Benilton Carvalho escreveu:
Ok... Comentários específicos para suas perguntas:
1) experimente armazenar a saída do read.csv.sql numa variável... Ex
X = read.csv.sql(todos os seus argumentos)
Vc verá os warnings, são apenas mensagens de aviso, não erros.
Alternativamente, use o sqlite na linha de comando mesmo... E vc pode importar o seu csv diretamente daqui, sem necessitar do sqldf.
para regressões, use biglm
2) evite mexer com swap. Use isso apenas como ultimo recurso
3 para auxiliar no garbage collection, ao trabalhar com grandes volumes de dados, remova os objetos desnecessários e, em seguida, use gc(). O R não é mau o suficiente para manter em memória objetos que vc já removeu. Esse recurso é algo do seu sistema operacional, que mantém em cache objetos que vc usou recentemente, para que não precise carregar novamente qdo vc tentar trabalhar naqueles dados de novo. O gc() vai avisar ao sistema operacional que pode limpar a cache, etc etc etc.
4) na real, paralelismo não tem muito como te ajudar nessa tarefa.
b
On Wednesday, 17 October 2012, Roney Fraga wrote:
Muito obrigado a todos pelas contribuições, já tenho material para estudar algumas semanas.
Benilton, é 64 bit.
.Machine$sizeof.pointer [1] 8
Abraço Roney
_______________________________________________ R-br mailing listR-br@listas.c3sl.ufpr.br <javascript:_e({}, 'cvml', 'R-br@listas.c3sl.ufpr.br');>https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
A forma que encontrei de resolver o problema para se trabalhar com grande volumes de dados foi conectando a um banco de dados. No meu caso, estou usando o SQLite com o pacote sqldf.
Pelo menos no meu caso, o ganho de desempenho foi incrível, uma vez que não preciso mais ficar carregando dados, sem falar que a capacidade agora está na casa dos TB.
Saudações
-- Frederico Steinmetz Alvarez Engenheiro Eletricista e de Produção Mestrando em Engenharia Eólica
Laboratório Didático Pedagógico - Mecânica dos Fluidos LDP-FLU Grupo de Mecânica dos Fluidos Ambientais da UFPE Homepage ( www.ufpe.br/mecfluamb/ ) Universidade Federal de Pernambuco - UFPE Departamento de Engenharia Mecânica
Fones: (48) 9143-5141 (VIVO) (81) 8885-1105 (OI)

O que faço com o sqldf e simplesmente acessar, selecionar e processar os dados com os comandos sql, uma vez que os dados foram salvos previamente numa base, nem sendo necessário carrega-los todo o tempo. Em 16/10/2012 13:41, "Roney Fraga" <roneyfraga@gmail.com> escreveu:
Caros,
Estou trabalhando com os dados dos censos populacionais de 2000 e 2010. A minha dificuldade é o volume de dados, pois cada censo tem aproximadamente 20 milhões de linhas. Considerando os dados estão em arquivos .csv, um único aquivo de 12 GB para o censo de 2010 e um arquivo para cada estado no censo de 2000, que totalizam 11 GB. Utilizo um notebook com processador Intel Core i5 2410M, 8 GB de ram com 3 GB de SWAP e o sistema operacional é o Arch Linux. Tenho quatro dúvidas que estão abaixo em meio da minha explicação sobre os problemas que venho enfrentando.
Para ler os arquivos .csv conheço as seguintes opções:
a) trabalhar com um banco de dados relacional. R.: estou com um problema com o postgresql que ainda não tenho solução, portanto, essa alternativa esta descartada no momento.
b) utilizar o sqldf. R.: acredito que o sqldf não é eficiênte para trabalhar com arquivos grandes, o processo é encerrado antes de concluir a operação. Exemplo:
library(sqldf) read.csv.sql('censo00ba1.csv', sql = "select V0102 from file", header = TRUE, sep = ",") [ reached getOption("max.print") -- omitted 1498127 rows ] Warning messages: 1: closing unused connection 4 (censo00ba1.csv) 2: closing unused connection 5 (censo00ba1.csv)
1ª dúvida: isso sempre acontece com o sqldf, ou alguém consegue utilizá-lo com para ler arquivos grandes?
c) utilizar o comando cut e grep do Linux/Mac para filtrar os dados e ter um arquivo .csv menor, dessa forma é possível ler o arquivo pelo comando do R, read.csv(). R.: utilizei essa opção. Exemplo: cut -d',' -f1,4,5,6,10,79,81,84,91,92,95,97,111,113,114,149,150,188 br2010.csv > br2010b.csv
Uma vez superada a dificuldade da importação dos dados deletei algumas coisas e fiquei com três arquivos com as seguintes dimensões:
dim(cs);dim(cs2000);dim(cs2010) [1] 6077327 23 # censos 2000 e 2010 [1] 2865716 23 # censo 2000 [1] 3211611 23 # censo 2010
Quanto ao processamento:
d) Consigo rodar regressão simples para o censo de 2000 e para o censo de 2010 separadamente, como segue exemplo:
ma <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2000) mb <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF), data=cs2010)
mas não consigo rodar o mesmo modelo para os dados do arquivo 'cs', que tem 6.077.327 linhas, que é censo 2000 mais censo 2010. Pois, aparece a seguinte mensagem de erro:
mc <- lm(lnrenda ~ factor(ee) + idade + idade2 + factor(tt) + factor(cor.raca) + rural + feminino + migrante + factor(UF) + factor(ano), data=cs) Error: cannot allocate vector of size 2.0 Gb
2ª dúvida: qual procedimento posso utilizar para solucionar esse problema de rodar a regressão das 6.077.327 observações? Um amigo indicou aumentar a memória SWAP, essa é uma boa opção?
3ª dúvida: ao realizar um processo que demanda muita memória ram o R não consegue realizar outro processo pesado em seguida, pois a memória fica ocupada. Exemplo, ao rodar uma regressão em uma base de dados com 3 milhões de linhas eu não consigo realizar outra regressão pq a memória fica cheia. Dúvida, tem como 'limpar' os dados da memória para poder realizar outros cálculos?
4ª dúvida: trabalhar com paralelismo pode auxiliar nesse tipo de processamento?
Grato pela atenção. Roney
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
participantes (8)
-
Benilton Carvalho
-
Diogo Ferrari
-
Fabio Mathias Corrêa
-
Fernando Mayer
-
Fred
-
Frederico Steinmetz Alvarez
-
Roney Fraga
-
Rubem Kaipper Ceratti