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