Python Pandas - MemoryError пытается прочитать большой файл .txt - PullRequest
0 голосов
/ 29 июня 2018

У меня «MemoryError», когда я пытаюсь прочитать файл с 45 миллионами файлов.

Как решить эту проблему?

ПРИМЕЧАНИЕ: Мой код работает для небольших файлов

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

from pandas.tools.plotting import scatter_matrix

import matplotlib.pyplot as plt
from pylab import rcParams
import seaborn as sb


address = 'file.txt'         //File with 45 millions lines = 500 MB
test = pd.read_csv(address)
test.columns = ['Year','Data']

test.boxplot(column='Data', by = 'Year')

plt.show()

Это ошибка:

Traceback (most recent call last):
  File "plot2.py", line 13, in <module>
    test = pd.read_csv(address)
  File "C:\Users\EYM\Desktop\web_scraping\venv\lib\site-packages\pandas\io\parsers.py", line 678, in parser_f
return _read(filepath_or_buffer, kwds)
  File "C:\Users\EYM\Desktop\web_scraping\venv\lib\site-packages\pandas\io\parsers.py", line 446, in _read
data = parser.read(nrows)
  File "C:\Users\EYM\Desktop\web_scraping\venv\lib\site-packages\pandas\io\parsers.py", line 1036, in read
ret = self._engine.read(nrows)
  File "C:\Users\EYM\Desktop\web_scraping\venv\lib\site-packages\pandas\io\parsers.py", line 1848, in read
data = self._reader.read(nrows)
  File "pandas\_libs\parsers.pyx", line 876, in pandas._libs.parsers.TextReader.read
  File "pandas\_libs\parsers.pyx", line 919, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas\_libs\parsers.pyx", line 2141, in pandas._libs.parsers._concatenate_chunks
MemoryError

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

В приведенном ниже URL вы можете увидеть параметры. Одним из параметров является chunksize, так что вы можете использовать его.

chunksize = SOMEVALUE
for chunk in pd.read_csv(filename, chunksize=chunksize):
    process(chunk)

Параметры read_csv

0 голосов
/ 29 июня 2018

Вы не можете поместить этот большой DataFrame в память. Есть несколько способов обойти это:

Сначала вы можете разобрать его старым способом, используя библиотеку csv, читая файл построчно и записывая его в словарь. Панды используют оптимизированные структуры для хранения кадров данных в памяти, которые намного тяжелее вашего основного словаря.

Другим способом было бы использовать параметр nrows (или chunksize) в read_csv, чтобы только читать части файла, а затем делать свои вещи на фреймах данных одну за другой и сохранять их в отдельных файлах pkl.

Если вам нужна только статистическая информация о данных, вы можете просто получить их, а затем отбросить кадры данных. Вы также можете просто извлечь полезные данные, чтобы получить меньшие кадры данных, а затем объединить их в один кадр данных, который может поддерживать ваша память.

Если вам абсолютно необходим полный массив данных и большая часть данных является числовой, вы можете оптимизировать память с помощью этой функции:

def reduce_mem(df):
    df = df.apply(pd.to_numeric, errors='ignore', downcast='float')
    df = df.apply(pd.to_numeric, errors='ignore', downcast='integer')
    df = df.apply(pd.to_numeric, errors='ignore', downcast='unsigned')

Вам по-прежнему приходится считывать блок данных по блокам (используя chunksize или nrows), но затем вы можете попытаться объединить фрагменты, если сокращения памяти достаточно.

Также вот полезная функция: df.memory_usage(deep=True) печатает размер DataFrame

0 голосов
/ 29 июня 2018

использовать low_memor (по умолчанию True) Параметр в false:

>>> test = pd.read_csv(address,sep=" ",low_memor = False)

Попробуйте также:

>>>chunksize = size of chunk
>>> for chunk in pd.read_csv(filename, chunksize=chunksize,low_memor = False):
           process(chunk)

читать этот блог (https://www.dataquest.io/blog/pandas-big-data/)

...