<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
com fread() e' possivel ainda selecionar colunas. Para trazer as
respostas a prova de matematica, o gabarito e o escore demorou 14
segundos...<br>
<br>
system.time(all <-
fread("../dados/dados2012/DADOS/DADOS_ENEM_2012.csv", select=c(64,
73, 78)))<br>
Read 5791065 rows and 3 (of 80) columns from 3.522 GB file in
00:00:12<br>
user system elapsed <br>
10.874 0.898 14.126 <br>
<br>
<div class="moz-cite-prefix">On 26/10/14 12:23, Elias T. Krainski
wrote:<br>
</div>
<blockquote cite="mid:544CD9C4.8060406@yahoo.com.br" type="cite">
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
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 moz-do-not-send="true"
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 moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a>
<a moz-do-not-send="true" 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 moz-do-not-send="true" 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>
<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>