【发布时间】:2013-07-07 13:58:05
【问题描述】:
我正在尝试做一些相当简单的事情,将一个大的 csv 文件读入 pandas 数据帧。
data = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2)
代码要么以MemoryError 失败,要么永远不会完成。
任务管理器中的内存使用停止在 506 Mb 并且在 5 分钟没有变化并且进程中没有 CPU 活动后,我停止了它。
我使用的是熊猫版本 0.11.0。
我知道文件解析器曾经存在内存问题,但根据 http://wesmckinney.com/blog/?p=543 应该已经解决了。
我要读取的文件是 366 Mb,如果我将文件缩减为较短的文件 (25 Mb),上面的代码就可以工作。
还发生了一个弹出窗口,告诉我它无法写入地址 0x1e0baf93...
堆栈跟踪:
Traceback (most recent call last):
File "F:\QA ALM\Python\new WIM data\new WIM data\new_WIM_data.py", line 25, in
<module>
wimdata = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2
)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, line 401, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, line 216, in _read
return parser.read()
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, line 643, in read
df = DataFrame(col_dict, columns=columns, index=index)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\frame.py"
, line 394, in __init__
mgr = self._init_dict(data, index, columns, dtype=dtype)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\frame.py"
, line 525, in _init_dict
dtype=dtype)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\frame.py"
, line 5338, in _arrays_to_mgr
return create_block_manager_from_arrays(arrays, arr_names, axes)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\internals
.py", line 1820, in create_block_manager_from_arrays
blocks = form_blocks(arrays, names, axes)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\internals
.py", line 1872, in form_blocks
float_blocks = _multi_blockify(float_items, items)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\internals
.py", line 1930, in _multi_blockify
block_items, values = _stack_arrays(list(tup_block), ref_items, dtype)
File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\internals
.py", line 1962, in _stack_arrays
stacked = np.empty(shape, dtype=dtype)
MemoryError
Press any key to continue . . .
一些背景知识 - 我试图让人们相信 Python 可以做与 R 相同的事情。为此,我正在尝试复制一个可以做到的 R 脚本
data <- read.table(paste(INPUTDIR,config[i,]$TOEXTRACT,sep=""), HASHEADER, DELIMITER,skip=2,fill=TRUE)
R 不仅可以很好地读取上述文件,它甚至可以在 for 循环中读取其中的几个文件(然后对数据进行一些处理)。如果 Python 确实对这种大小的文件有问题,我可能会打一场失败的战斗......
【问题讨论】:
-
当然,熊猫不应该对这种大小的 csvs 有问题。您可以在线发布此文件吗?
-
您也可以尝试将
nrows=something small传递给read_csv以确保它不是导致问题的文件的大小,正如安迪所说,不应该是案例。 -
我找到了以下解决问题的方法:将 csv 读取为块
csv_chunks = pandas.read_csv(filepath, sep = DELIMITER,skiprows = 1, chunksize = 10000),然后连接块df = pandas.concat(chunk for chunk in csv_chunks)。我仍然很想知道为什么一口气阅读它不起作用,对我来说这看起来像是 csv 阅读器的问题。 -
如果有人还在关注这个,我有一点更新。我开始相信 csv 解析器很好(而且速度也很快),但是在创建数据帧时存在某种内存问题。我相信这一点的原因:当我使用
chunksize=1000hack 来读取 csv,然后尝试将所有块连接到一个大数据帧中时,内存就会爆炸,相比之下,内存占用大约是 3-4 倍到原始文件的大小。有谁知道为什么数据框可能会爆炸? -
其实发现限制是我的问题。现在它正在工作。 fromtxt 对我来说太慢了。现在我遇到了不同的内存不足错误,其中表(合并后)逐渐变大到大约 15M 行。可能需要考虑 memmap 和/或 hdf5