<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>