[R-br] file.append
Benilton Carvalho
beniltoncarvalho em gmail.com
Quinta Abril 4 13:54:02 BRT 2013
file.append funciona exatamente para o q vc descreveu: concatenar
arquivos *texto* (ou algum binario maluco q nao tenha marca de
fim/comeco de arquivo).
Em 4 de abril de 2013 13:47, Alexandre Ribeiro Leichsenring
<aleleich em uol.com.br> escreveu:
> Interessante, agradeço pelas sugestões.
>
> O file.append me deu a esperança de fazer essa parte da manipulação sem
> carregar os dados na memória. Os dados serão processados em outras
> plataformas na etapa seguinte, então os dados definitivamente não
> precisariam passar pela memória.
>
> Mas (desculpem se a pergunta parece tola) para que serve o file.append se
> você não consegue acessar o conteúdo adicionado? O curioso é que o
> file.append funciona diferente com arquivos csv, ou seja, se faço a
> concatenação de dois arquivos csv por file.append e depois importo o arquivo
> concatenado, recebo o conteúdo dos dois arquivos concatenados...
>
> Alexandre
>
>
>
> Em 4 de abril de 2013 13:08, Benilton Carvalho <beniltoncarvalho em gmail.com>
> escreveu:
>
>> 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.
>> _______________________________________________
>> 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.
Mais detalhes sobre a lista de discussão R-br