Python Pandas-MemoryError尝试读取大文件.txt

时间:2018-06-29 15:25:10

标签: python pandas boxplot

我尝试读取包含4500万个文件的文件时出现“ MemoryError”。

如何解决此问题?

注意:我的代码适用于小文件

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 :(得分:0)

使用low_memor(默认为True),参数为false:

(denominator != 0 ? nominator/denominator : Infinity)

也尝试以下操作:

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

阅读此博客(https://www.dataquest.io/blog/pandas-big-data/

答案 1 :(得分:0)

在下面的URL中,您可以看到参数。参数之一是chunksize,因此您可以使用它。

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

read_csv parameters

答案 2 :(得分:0)

您无法在内存中容纳这么大的DataFrame。有几种解决方法:

首先,您可以使用csv库以旧的方式解析它,逐行读取文件并将其写入字典。熊猫使用优化的结构将数据帧存储到内存中,这比基本字典要重得多。

另一种方法是使用read_csv中的nrows(或chunksize)参数仅读取文件的一部分,然后对数据帧逐个处理并将其保存在单独的pkl文件中。

如果仅需要有关数据的统计信息,则只需获取这些信息,然后丢弃数据框。您也可以只提取有用的数据以获取较小的数据框,然后将它们合并为内存可以支持的一个数据框。

如果您绝对希望dataFrame的整体并且大多数数据是数字的,则可以使用以下函数来优化内存:

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的大小