<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Walmes, <br>
<br>
Muito legal a dica de usar o shell para isso. O shell e' sempre mais
rapido que qualquer coisa!<br>
<br>
Sobre ler dados do ENEM, usando fread() do pacote 'data.table'
demorou 210 segundos no meu laptop para dados 2012 do ENEM. Eu nao
gostei muito do INEP ter disponibilizado o formato .csv.
Anteriormente, dados de 2010 por exemplo, usava-se o formato fixed
width. Usando uma funcao (descrita em
<a class="moz-txt-link-freetext" href="http://www.leg.ufpr.br/doku.php/disciplinas:ce223101:historico2010">http://www.leg.ufpr.br/doku.php/disciplinas:ce223101:historico2010</a>)
demorou 238 segundos para ler os dados de 2010 (4.6 milhoes de
linhas) e selecionar prova de matematica dos alunos do Parana. <br>
<br>
Essa funcao que usei para ler (e SELECIONAR linhas, colunas) fixed
width usa a mesma ideia que voce fez usando read.table(). A
diferenca e' que eu abro uma coneccao apenas e uso readLines(). O
que voce fez com read.table() e' ineficiente porque ao ler cada
bloco e' feita uma nova coneccao com o arquivo (via funcao scan()) e
ao ler o i-e'simo bloco a funcao scan() precisa percorrer todos os
dados dos blocos anteriores antes de comecar a ler. Assim, para ler
os ultimos blocos demora-se um tempo enorme percorrendo...<br>
<br>
Abs,<br>
Elias.<br>
<br>
<div class="moz-cite-prefix">On 25/10/14 00:22, walmes . wrote:<br>
</div>
<blockquote
cite="mid:CAFU=Ekbz8c+BGoYRKjV_G11bc4QsH3LvZLxMSJs4kF5wTz-ZSA@mail.gmail.com"
type="cite">
<div dir="ltr">
<div class="gmail_default" style="font-family:trebuchet
ms,sans-serif">Saudações,<br>
<br>
</div>
<div class="gmail_default" style="font-family:trebuchet
ms,sans-serif">Essa mensagem é apenas para compartilhar uma
experiência que tive e considero que o problema aqui discutido
não seja tão particular.<br>
<br>
</div>
<div class="gmail_default" style="font-family:trebuchet
ms,sans-serif">Fui procurado por alguém que precisava
processar um arquivo com resultados da prova do ENEM 2012 para
aplicar teoria de resposta ao item. Precisava-se processar o
arquivo original para chegar em um que tivesse apenas 5 das 80
colunas (notas para as competências sobre a redação) e somente
às linhas que tivessem o conteúdo "P" (de presente) para a
coluna "IN_STATUS_REDACAO". O arquivo é um csv, delimitador
vírgula, aspas nas strings, 5791066 de linhas, 3.8 GB. Fiz o
que me veio na cabeça de primeira: "dividir para conquistar".
Lia porções de 30 mil linhas do arquivo (usando na
read.table() o skip= e nrow=), separava as 5 colunas, mantinha
só as linhas com registro P e escrevia para um arquivo com
write.table(..., append=TRUE). Isso dentro de um for(). Na
minha implementação, um tanto ingenua e corrida porque fiz
enquanto era assistido a programar, quanto apliquei ao arquivo
alvo levou 3h40. Esperava que fosse demorar mas não tanto.
Minha máquina tem 16 GB de RAM. Sabendo que o bash do linux é
muito eficiente para tarefas como operações em arquivos texto,
eu fui buscar na internet como fazer o mesmo. Resultado é que
tudo se resolveu com 37 segundos!!! É por isso que achei
interessante compartilhar com a lista, inclusive para saber se
alguem tem meios alternativos para solucionar o problema.
Seguem os comandos que apliquei no terminal do Linux. Os dados
fornecidos no exemplo são apenas as 10 mil primeiras linhas do
arquivo original.<br>
<br>
<span style="font-family:courier new,monospace">##-----------------------------------------------------------------------------<br>
## 0. Aquisição dos dados. Apenas 10000 registros dos
5791066 do arquivo<br>
## original.<br>
<br>
wget <a moz-do-not-send="true"
href="http://www.leg.ufpr.br/%7Ewalmes/data/DADOS_ENEM_2012_10millinhas.csv">http://www.leg.ufpr.br/~walmes/data/DADOS_ENEM_2012_10millinhas.csv</a>
-O DADOS_ENEM_2012.csv<br>
ls<br>
wc -l DADOS_ENEM_2012.csv<br>
<br>
##-----------------------------------------------------------------------------<br>
## 1. Filtrar só às colunas de interesse. Da 74 à 79. Na 74
tem-se os<br>
## valores P, F e outros.<br>
<br>
cut -d , -f 74-79 DADOS_ENEM_2012.csv > file.csv<br>
head -10 file.csv<br>
wc -l file.csv<br>
<br>
##-----------------------------------------------------------------------------<br>
## 2. Manter só as linhas com ocorrência do P.<br>
<br>
grep "P" file.csv > fileP.csv<br>
wc -l fileP.csv<br>
head -10 fileP.csv<br>
<br>
##-----------------------------------------------------------------------------<br>
## 3. Remover à colunas com P, ou seja, manter da 2 à 6.<br>
<br>
cut -d , -f 2-6 fileP.csv > file.csv<br>
head -10 file.csv<br>
wc -l file.csv<br>
<br>
##-----------------------------------------------------------------------------<br>
## 4. Remover as aspas para salvar espaço em disco.<br>
<br>
sed 's/\"//g' file.csv > fileP.csv<br>
head -10 fileP.csv<br>
<br>
##-----------------------------------------------------------------------------<br>
## 5. Como contar o número de linhas repetidas. Gerar tabela
de frequência dos<br>
## padrões de resposta. Economiza espaço e é a informação
mínima<br>
## necessária para ajustar TRI. Remover o cabeçalho.<br>
<br>
sed 1d fileP.csv > file.csv<br>
sort file.csv | uniq --count > fileP.csv<br>
head -10 fileP.csv<br>
tail -10 fileP.csv<br>
<br>
##-----------------------------------------------------------------------------<br>
## 6. Eliminar espaços no ínicio e colocar uma vírgula entre
a<br>
## frequência e o primeiro registro para que todos os campos
sejam<br>
## separados por `,`.<br>
<br>
sed -e 's/^ *//;s/ /,/' fileP.csv > fileFreq.csv<br>
head -10 fileFreq.csv<br>
wc -l fileFreq.csv<br>
<br>
##-----------------------------------------------------------------------------<br>
</span><br>
À disposição.<br>
Walmes.<br>
</div>
<div class="gmail_default" style="font-family:trebuchet
ms,sans-serif"><br clear="all">
</div>
<div>
<div dir="ltr"><span style="font-family:trebuchet
ms,sans-serif">==========================================================================</span><br
style="font-family:trebuchet ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">Walmes
Marques Zeviani</span><br style="font-family:trebuchet
ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">LEG
(Laboratório de Estatística e Geoinformação, 25.450418 S,
49.231759 W)</span><br style="font-family:trebuchet
ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">Departamento
de Estatística - Universidade Federal do Paraná</span><br
style="font-family:trebuchet ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">fone:
(+55) 41 3361 3573</span><br style="font-family:trebuchet
ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">skype:
walmeszeviani<br style="font-family:trebuchet
ms,sans-serif">
</span><span style="font-family:trebuchet ms,sans-serif">homepage:
<a moz-do-not-send="true"
href="http://www.leg.ufpr.br/%7Ewalmes" target="_blank">http://www.leg.ufpr.br/~walmes</a></span><br
style="font-family:trebuchet ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">linux user
number: 531218</span><br style="font-family:trebuchet
ms,sans-serif">
<span style="font-family:trebuchet ms,sans-serif">==========================================================================</span></div>
</div>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
R-br mailing list
<a class="moz-txt-link-abbreviated" href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a>
<a class="moz-txt-link-freetext" href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a>
Leia o guia de postagem (<a class="moz-txt-link-freetext" href="http://www.leg.ufpr.br/r-br-guia">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.</pre>
</blockquote>
<br>
</body>
</html>