1
resposta

Problema para abrir a base de dados

Olá,

Estou tendo um problema ao carregar a base de dados "MICRODADOS_ENEM_2017.csv". Ao tentar carregar, o seguinte erro acontece:


---------------------------------------------------------------------------

MemoryError                               Traceback (most recent call last)

<ipython-input-10-a3947b95c19a> in <module>
      1 # solução
----> 2 enem = pd.read_csv('C:/Users/mathe/OneDrive/Documentos/Python/MicrodadosEnem2017/input/MICRODADOS_ENEM_2017.csv',sep=';',encoding='iso-8859-1',usecols=["NU_NOTA_CN","NU_NOTA_CH","NU_NOTA_LC", "NU_NOTA_MT", "NU_NOTA_COMP1", "NU_NOTA_COMP2", "NU_NOTA_COMP3", "NU_NOTA_COMP4", "NU_NOTA_COMP5"])
      3 

c:\users\mathe\appdata\local\programs\python\python37-32\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, doublequote, delim_whitespace, low_memory, memory_map, float_precision)
    676                     skip_blank_lines=skip_blank_lines)
    677 
--> 678         return _read(filepath_or_buffer, kwds)
    679 
    680     parser_f.__name__ = name

c:\users\mathe\appdata\local\programs\python\python37-32\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    444 
    445     try:
--> 446         data = parser.read(nrows)
    447     finally:
    448         parser.close()

c:\users\mathe\appdata\local\programs\python\python37-32\lib\site-packages\pandas\io\parsers.py in read(self, nrows)
   1034                 raise ValueError('skipfooter not supported for iteration')
   1035 
-> 1036         ret = self._engine.read(nrows)
   1037 
   1038         # May alter columns / col_dict

c:\users\mathe\appdata\local\programs\python\python37-32\lib\site-packages\pandas\io\parsers.py in read(self, nrows)
   1846     def read(self, nrows=None):
   1847         try:
-> 1848             data = self._reader.read(nrows)
   1849         except StopIteration:
   1850             if self._first_chunk:

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.read()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()

pandas\_libs\parsers.pyx in pandas._libs.parsers._concatenate_chunks()

MemoryError: 

Estou usando a seguinte linha de código:

enem = pd.read_csv('../input/MICRODADOS_ENEM_2017.csv',sep=';',encoding='iso-8859-1',usecols=["NU_NOTA_CN","NU_NOTA_CH","NU_NOTA_LC", "NU_NOTA_MT", "NU_NOTA_COMP1", "NU_NOTA_COMP2", "NU_NOTA_COMP3", "NU_NOTA_COMP4", "NU_NOTA_COMP5"])

Pelo que vi, esse erro é comum quando o tamanho da base de dados é grande (essa possui quase 4GB). Não sei como fazer para carregar esse arquivo e por causa desse problema, não consigo prosseguir com as atividades.

Agradeço pela ajuda,

Matheus

1 resposta

Olá Matheus,

Tenta fazer assim:

# chunksize = número de linhas lidas por vez
chunks = pd.read_csv('../input/MICRODADOS_ENEM_2017.csv',sep=';',encoding='iso-8859-1',usecols=["NU_NOTA_CN","NU_NOTA_CH","NU_NOTA_LC", "NU_NOTA_MT", "NU_NOTA_COMP1", "NU_NOTA_COMP2", "NU_NOTA_COMP3", "NU_NOTA_COMP4", "NU_NOTA_COMP5"], chunksize=100000)

dfList = []
for df in chunks:
    dfList.append(df)

enem = pd.concat(dfList,sort=False)

Esse código utilizando o chunksize não lê o arquivo inteiro de uma vez, vai lendo em pedaços (pedaços de 100000 linhas nesse caso), e depois junta esses pedaços em um único DataFrame com todas as informações juntas.

Caso ainda não funcione, testa utilizando chunksize=10000 ou chunksize=1000.

Se isso ainda não funcionar talvez seja melhor tentar usar o colab ou trabalhar com os dados em pedaços mesmo, caso não dê para utilizar um computador com mais memória.