[R-br] file.append

Benilton Carvalho beniltoncarvalho em gmail.com
Quinta Abril 4 13:08:59 BRT 2013


Carregue um arquivo por vez e salve o conteudo num formato proprio
para grandes volumes: NetCDF, HDF5.

Uma alternativa e':
1) ler o primeiro arquivo
2) escrever o conteudo como um txt (separado por tabulacao, por exemplo)
3) remover o obj da memoria
4) ler o segundo arquivo
5) escrever o conteudo no mesmo arquivo q o passo 2 (use o argumento
append=TRUE do write.table)
6) remova o obj da memoria
7) use ff ou bigmemory (ou sqldf) para "reimportar" o conteudo em memoria

E' uma alternativa mais lenta, mas tambem funciona.

b

Em 4 de abril de 2013 11:37, Manoel Galdino <mcz.fea em gmail.com> escreveu:
> Olá alexandre,
>
> Eu não sei o que o file.append faz, mas imagino que por concatenar você quer
> dizer algo como merge (e não, por exemplo, rbind). Há formas de concatenar
> os bancos sem carregar na memória. Mas a questão é se você quer depois
> trabalhar no R com os dois bancos juntos, dependendo do que você quer fazer
> terá que carregar na memória.
>
> Uma forma de concatenar os bancos antes de carregar na memória, me parece, é
> usando o pacote sqldf. Mas no final ele vai colocar os dois bancos
> concatenados na memória, então não parece que vai resolver seu problema. De
> todo modo...
>
> Eu imagino alguma coisa assim:
>
> library(sqldf)
> f1 <- file(“bigdf1.csv”)
> f2 <- file(“bigdf2.csv”)
>
> bigdf <- sqldf(
>                   “select * from f1 join f2 on key.f1 = key.f2”, dbname =
> tempfile(), file.format = list(header = T, row.names = F)))
>
> Dessa forma ele carrega os bancos numa base de dados sqlite, executa a query
> (no caso, com um join) e retorna o banco para o R. Mas ele retorna para o R!
>
> Outra possibilidade é o usar o pacote ff.
>
> abç
> M
>
>
>
> 2013/4/4 Alexandre Ribeiro Leichsenring <aleleich em uol.com.br>
>>
>> Obrigado, Benilton,
>>
>> A questão é exatamente essa, estou tentando evitar carregar os arquivos na
>> memória (estou trabalhando com um conjunto de arquivos que somam 50 GB).
>> Existe alguma maneira de manipular essa marcação de fim de arquivo? Ou
>> alguma outra sugestão para concatenar data.frames (com as mesmas variáveis)
>> sem precisar carregar os dados na memória?
>>
>> Abraço,
>>
>> Alexandre
>>
>>
>>
>>
>>
>> Em 3 de abril de 2013 21:48, Benilton Carvalho
>> <beniltoncarvalho em gmail.com> escreveu:
>>>
>>> O que acontece e' q o arquivo final e' sim a concatenacao dos dois...
>>> mas o formato possui marcadores de fim de arquivo... e, por isso,
>>> concatenar arquivos binarios nao e' uma boa ideia...
>>>
>>> A estrutura (super-simplificada) interna de um arquivo binario gravado
>>> pelo R e':
>>>
>>> Magic-number #q identifica a validade do arquivo para aquele formato
>>> Cabecalhos e outros detalhes
>>> CONTEUDO... -> seus dados vem aqui
>>> Sinal de fim de arquivo...
>>>
>>> Dai' ao concatenar via file.append, vc fica com:
>>>
>>> Magic-number do arquivo1
>>> Cabecalhos e outros detalhes do arquivo1
>>> CONTEUDO do arquivo1
>>> Sinal de fim de arquivo1
>>> Magic-number do arquivo2
>>> Cabecalhos e outros detalhes do arquivo2
>>> CONTEUDO do arquivo2
>>> Sinal de fim de arquivo2
>>>
>>> Assim, o tamanho total e' a soma dos dois tamanhos... mas ao comecar a
>>> ler o arquivo e chegar em "Sinal de fim de arquivo1", o R pára por ali
>>> (afinal, ali e' um comando de "pare de ler, pq aqui eh o fim") e
>>> retorna os valores ate' entao obtidos... sem comecar no arquivo2...
>>>
>>> Se vc quiser de fato combinar ambos os arquivos, o q vc precisa fazer e':
>>>
>>> obj1 = load("arquivo1.RData")
>>> obj2 = load("arquivo2.RData")
>>> save(list=c(obj1, obj2), file="arquivo1.RData")
>>>
>>> Eu entendo pq vc gostaria de algo como file.append (afinal, vc pode
>>> nao querer abrir cada um dos arquivos e entao salvar de novo, etc)...
>>> mas, este e' o jeito "certo" de se fazer o q vc deseja.
>>>
>>> b
>>>
>>> Em 3 de abril de 2013 17:27, Alexandre Ribeiro Leichsenring
>>> <aleleich em uol.com.br> escreveu:
>>> > Olá a todos,
>>> >
>>> > Estou tendo dificuldades com a função file.append.
>>> >
>>> > Quando faço a concatenação de dois arquivos RData usando "file.append",
>>> > vejo
>>> > que o tamanho do arquivo resultante (em bytes) é igual à soma dos
>>> > tamanhos
>>> > dos arquivos originais. Porém, quando carrego o arquivo concatenado,
>>> > aparece
>>> > um objeto contendo somente os elementos do primeiro arquivo:
>>> >
>>> >> rm(list=ls())
>>> >
>>> >> # Criando arquivo 1
>>> >> (df <- data.frame(x = letters[1:5], y = 1:5))
>>> >   x y
>>> > 1 a 1
>>> > 2 b 2
>>> > 3 c 3
>>> > 4 d 4
>>> > 5 e 5
>>> >> save(df, file = "df1.RData")
>>> >> rm(df)
>>> >
>>> >> # Criando arquivo 2
>>> >> (df <- data.frame(x = LETTERS[1:5], y = 10*(1:5)))
>>> >   x  y
>>> > 1 A 10
>>> > 2 B 20
>>> > 3 C 30
>>> > 4 D 40
>>> > 5 E 50
>>> >> save(df, file = "df2.RData")
>>> >> rm(df)
>>> >
>>> >> # Criando uma cópia do arquivo 1
>>> >> file.copy(from = "df1.RData", to = "df.RData", overwrite = T)
>>> > [1] TRUE
>>> >>
>>> >> # Concatenando df2 em df.
>>> >> file.append("df.RData", "df2.RData")
>>> > [1] TRUE
>>> >
>>> >> file.info("df1.RData")
>>> >                     size isdir mode               mtime
>>> > ctime
>>> > atime exe
>>> > df1.RData  177 FALSE  666 2013-04-03 17:19:39 2013-04-03 16:52:49
>>> > 2013-04-03
>>> > 16:52:49  no
>>> >
>>> >> file.info("df2.RData")
>>> >                     size isdir mode               mtime
>>> > ctime
>>> > atime exe
>>> > df2.RData  197 FALSE  666 2013-04-03 17:19:39 2013-04-03 16:52:50
>>> > 2013-04-03
>>> > 16:52:50  no
>>> >
>>> >> file.info("df.RData")
>>> >                  size isdir mode               mtime
>>> > ctime
>>> > atime exe
>>> > df.RData  374 FALSE  666 2013-04-03 17:19:39 2013-04-03 16:56:50
>>> > 2013-04-03
>>> > 16:56:50  no
>>> >
>>> >> load("df.RData")
>>> >> df
>>> >   x y
>>> > 1 a 1
>>> > 2 b 2
>>> > 3 c 3
>>> > 4 d 4
>>> > 5 e 5
>>> >
>>> > Alguém sabe dizer o que está acontecendo?
>>> >
>>> > Obrigado,
>>> >
>>> > Alexandre
>>> >
>>> > _______________________________________________
>>> > R-br mailing list
>>> > R-br em 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.
>>> _______________________________________________
>>> R-br mailing list
>>> R-br em 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.
>>
>>
>>
>> _______________________________________________
>> R-br mailing list
>> R-br em 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.
>
>
>
>
> --
> Manoel Galdino
> https://sites.google.com/site/galdinomcz/
>
> _______________________________________________
> R-br mailing list
> R-br em 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.


Mais detalhes sobre a lista de discussão R-br