Como trabalhar com uma base de dados muito grande

Estou com problema para utilizar a minha base de dados(.mdb). Ela tem em torno de 2 milhões de registros, e
quando tento executar aparece um erro de falta de memória ("Erro: não é possível alocar vetor de tamanho 1.1 Gb"). Como posso resolver essa questão?
Coloquei um exemplo reproduzivel, inclusive com a leitura de dados.
Criei um arquivo com parte da minha base de dados. O link é http://www.datafilehost.com/download-529c5b03.html
<http://www.datafilehost.com/download-529c5b03.htmlO> O código que eu estou utilizando está no link http://www.datafilehost.com/download-a5b8a3ca.html Obrigado,
Carlos Mendonça.

Carlos, ando meio enrolado para ver com detalhes o que pode estar acontecendo... e, alem disso, nao consigo usar o odbcConnectAccess (pode ser que seja especifico de plataforma - mas isso eh o minimo, nao fui procurar detalhes). A minha impressao eh que o problema q vc tem eh exatamente por conta de rep(valor, ponderador)... entao, uma ideia a se tentar e' calcular os quantis sem precisar do rep... veja o codigo anexo (note q uso Hmisc, vc nao precisa fazer isso, continue da forma q ja esta fazendo, desde q o meu 'tmp' corresponda a sua tabela com todos os dados): ## INICIO library(Hmisc) tmp <- mdb.get('bd1_Teste.mdb', 'Plan1', fileEncoding='latin1', encoding='latin1') names(tmp) <- c('codigo', 'valor', 'ponderador', 'cad') equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) res <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(res) <- names(qs) return(res) } res <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) quantileByCounts(y$valor, y$ponderador, c(.25, .75)))) ## FIM 2011/7/2 Carlos Mendonça <csaeslpv@centroin.com.br>:
Estou com problema para utilizar a minha base de dados(.mdb). Ela tem em torno de 2 milhões de registros, e
quando tento executar aparece um erro de falta de memória ("Erro: não é possível alocar vetor de tamanho 1.1 Gb"). Como posso resolver essa questão?
Coloquei um exemplo reproduzivel, inclusive com a leitura de dados.
Criei um arquivo com parte da minha base de dados. O link é http://www.datafilehost.com/download-529c5b03.html
O código que eu estou utilizando está no link http://www.datafilehost.com/download-a5b8a3ca.html Obrigado, Carlos Mendonça.
_______________________________________________ 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.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

note q magicamente a minha funcao foi como equantileByCounts(), mas a intencao era quantileByCounts(). 2011/7/4 Benilton Carvalho <beniltoncarvalho@gmail.com>:
Carlos,
ando meio enrolado para ver com detalhes o que pode estar acontecendo... e, alem disso, nao consigo usar o odbcConnectAccess (pode ser que seja especifico de plataforma - mas isso eh o minimo, nao fui procurar detalhes).
A minha impressao eh que o problema q vc tem eh exatamente por conta de rep(valor, ponderador)... entao, uma ideia a se tentar e' calcular os quantis sem precisar do rep... veja o codigo anexo (note q uso Hmisc, vc nao precisa fazer isso, continue da forma q ja esta fazendo, desde q o meu 'tmp' corresponda a sua tabela com todos os dados):
## INICIO library(Hmisc) tmp <- mdb.get('bd1_Teste.mdb', 'Plan1', fileEncoding='latin1', encoding='latin1') names(tmp) <- c('codigo', 'valor', 'ponderador', 'cad')
equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) res <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(res) <- names(qs) return(res) }
res <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) quantileByCounts(y$valor, y$ponderador, c(.25, .75)))) ## FIM
2011/7/2 Carlos Mendonça <csaeslpv@centroin.com.br>:
Estou com problema para utilizar a minha base de dados(.mdb). Ela tem em torno de 2 milhões de registros, e
quando tento executar aparece um erro de falta de memória ("Erro: não é possível alocar vetor de tamanho 1.1 Gb"). Como posso resolver essa questão?
Coloquei um exemplo reproduzivel, inclusive com a leitura de dados.
Criei um arquivo com parte da minha base de dados. O link é http://www.datafilehost.com/download-529c5b03.html
O código que eu estou utilizando está no link http://www.datafilehost.com/download-a5b8a3ca.html Obrigado, Carlos Mendonça.
_______________________________________________ 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.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

On Sat, 2011-07-02 at 19:41 -0300, Carlos Mendonça wrote:
Estou com problema para utilizar a minha base de dados(.mdb). Ela tem em torno de 2 milhões de registros, e
quando tento executar aparece um erro de falta de memória ("Erro: não é possível alocar vetor de tamanho 1.1 Gb").
Como posso resolver essa questão?
Carlos, Você não pode me mandar uma base que não seja em mdb? Algo tipo um csv mesmo ... De todo o jeito me desculpe perguntar mas vc precisa usar a base toda ao mesmo tempo ? -- []s Tura

Benilton, funcionou perfeitamente. Consegui trabalhar com o arquivo completo, sem problema. Eu só precisei consertar a última linha do código, onde estava quantileByCounts(y$valor, y$ponderador corrigi para equantileByCounts(y$valor, y$ponderador. Muito obrigado. Se não for te tomar muito tempo, você poderia me dizer se nesse meu problema eu poderia utilizar o ff e como ficaria? Sò uma última coisa, quando eu preciso juntar dois arquivos isso só pode ser feito com o merge ou existe algum comando que seja semelhante ao comando set do SAS, que coloca um arquivo embaixo do outro? Agradeço e respondo também ao Bernardo, sim, eu preciso usar a base toda ao mesmo tempo. Obrigado mais uma vez, Carlos Mendonça.

A intencao era q a funcao fosse 'quantileByCounts' :-)... mas se funcionou, beleza. Apos olhar a sua estrutura de dados, o 'ff' nao poderia ajudar muito... Ele te permitiria representar sua tabela de dados de modo mais eficiente, mas o uso de quantile(rep(x, counts)) eh o q mata seu programa. Se vc tivesse seus dados em um formato de texto (tab, csv, por exemplo), vc poderia le-lo usando 'ff' diretamente e ter um objeto q usa muito pouca RAM representando todo o seu conjunto de dados. Entretanto, ao fazer quantile(rep(...)), vc perderia todo beneficio. Usando queries apropriadas no seu banco de dados, vc poderia extrair apenas um codigo por vez e pode ser que seu problema fosse resolvido se vc usasse isso... b 2011/7/4 Carlos Mendonça <csaeslpv@centroin.com.br>:
Benilton, funcionou perfeitamente. Consegui trabalhar com o arquivo completo, sem problema.
Eu só precisei consertar a última linha do código, onde estava quantileByCounts(y$valor, y$ponderador
corrigi para equantileByCounts(y$valor, y$ponderador. Muito obrigado.
Se não for te tomar muito tempo, você poderia me dizer se nesse meu problema eu poderia utilizar o ff e como ficaria?
Sò uma última coisa, quando eu preciso juntar dois arquivos isso só pode ser feito com o merge ou existe algum comando que seja
semelhante ao comando set do SAS, que coloca um arquivo embaixo do outro?
Agradeço e respondo também ao Bernardo, sim, eu preciso usar a base toda ao mesmo tempo.
Obrigado mais uma vez,
Carlos Mendonça. _______________________________________________ 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.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

Ok, Benilton, entendi. E quanto a minha outra pergunta, será que existe algum comando que seja semelhante ao comando set do SAS, que coloca um arquivo embaixo do outro? Ou isso só pode ser feito com o merge, no meu caso ele não teria uma variável com o mesmo valor para juntar. Muito obrigado, Carlos Mendonça.

eu nao entendo bem o q vc quer dizer com 'colocar um arquivo embaixo do outro'... se for simplesmente concatenar verticalmente dois conjuntos de dados, use o rbind: x1 = data.frame(x=rnorm(10), y=rnorm(10), grupo=1:10) x2 = data.frame(x=rnorm(10), y=rnorm(10), grupo=1:10) x3 = rbind(x1, x2) o conceito de merge e' pra quando vc quer unificar bancos de dados com informacoes distintas de acordo com uma chave: x1 = data.frame(x1=rnorm(10), y1=rnorm(10), grupo=1:10) x2 = data.frame(x2=rnorm(10), y2=rnorm(10), grupo=1:10) x3 = merge(x1, x2) b 2011/7/4 Carlos Mendonça <csaeslpv@centroin.com.br>:
Ok, Benilton, entendi. E quanto a minha outra pergunta, será que existe algum comando que seja semelhante ao comando
set do SAS, que coloca um arquivo embaixo do outro? Ou isso só pode ser feito com o merge, no meu caso ele não teria uma
variável com o mesmo valor para juntar.
Muito obrigado,
Carlos Mendonça.
_______________________________________________ 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.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

Benilton, o comando rbind era o que eu estava procurando. Muito obrigado por toda a ajuda. Agora já estou conseguindo caminhar. Eu sou usuário SAS e estou engatinhando no R, embora sinta uma grande diferença, estou gostando e pretendo me aprofundar mais. Sei que vou precisar muito ainda da ajuda de vocês. E com certeza pedirei. Um grande abraço, Carlos Mendonça. Em 4 de julho de 2011 14:13, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Ok, Benilton, entendi. E quanto a minha outra pergunta, será que existe algum comando que seja semelhante ao comando
set do SAS, que coloca um arquivo embaixo do outro? Ou isso só pode ser feito com o merge, no meu caso ele não teria uma
variável com o mesmo valor para juntar.
Muito obrigado,
Carlos Mendonça.
-- Um abraço, Mendonça
participantes (3)
-
Benilton Carvalho
-
Bernardo Rangel Tura
-
Carlos Mendonça