我尝试读取包含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
答案 0 :(得分:0)
使用low_memor(默认为True),参数为false:
(denominator != 0 ? nominator/denominator : Infinity)
也尝试以下操作:
>>> test = pd.read_csv(address,sep=" ",low_memor = False)
答案 1 :(得分:0)
在下面的URL中,您可以看到参数。参数之一是chunksize
,因此您可以使用它。
chunksize = SOMEVALUE
for chunk in pd.read_csv(filename, chunksize=chunksize):
process(chunk)
答案 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的大小