首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用pandas read_csv时出现内存错误

使用pandas read_csv时出现内存错误
EN

Stack Overflow用户
提问于 2013-07-10 03:57:50
回答 8查看 99.5K关注 0票数 87

我正在尝试做一些相当简单的事情,将一个大的csv文件读入到一个pandas数据帧中。

代码语言:javascript
复制
data = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2)

代码要么会因为MemoryError而失败,要么永远不会结束。

任务管理器中的内存使用率在506 Mb停止,5分钟后没有变化,进程中也没有CPU活动,我停止了它。

我使用的是pandas 0.11.0版。

我知道文件解析器曾经有一个内存问题,但根据的说法,这个问题应该已经解决了。

我尝试读取的文件是366 Mb,如果我将文件缩短为25 Mb,上面的代码就可以工作。

我还收到一个弹出窗口,告诉我它不能写入地址0x1e0baf93……

堆栈跟踪:

代码语言:javascript
复制
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的脚本

代码语言:javascript
复制
data <- read.table(paste(INPUTDIR,config[i,]$TOEXTRACT,sep=""), HASHEADER, DELIMITER,skip=2,fill=TRUE)

R不仅能够很好地读取上面的文件,它甚至在for循环中读取了几个这样的文件(然后对数据做了一些处理)。如果Python对这种大小的文件确实有问题,我可能会打一场失败的战斗……

EN

回答 8

Stack Overflow用户

发布于 2015-07-21 22:14:03

Windows内存限制

在Windows中使用32位版本时,python经常发生内存错误。这是因为32位默认处理only gets 2GB of memory to play with

降低内存使用率的技巧

如果你没有在windows中使用32位python,但希望在读取csv文件时提高内存效率,这里有一个技巧。

pandas.read_csv function使用一个名为dtype的选项。这让pandas知道您的csv数据中存在哪些类型。

它是如何工作的

默认情况下,pandas会尝试猜测您的csv文件的数据类型。这是一个非常繁重的操作,因为当它确定数据类型时,它必须将所有原始数据作为对象(字符串)保存在内存中。

示例

假设您的csv如下所示:

代码语言:javascript
复制
name, age, birthday
Alice, 30, 1985-01-01
Bob, 35, 1980-01-01
Charlie, 25, 1990-01-01

当然,这个例子读入内存是没有问题的,但它只是一个例子。

如果pandas读取上面的csv文件而不带任何dtype选项,那么年龄将作为字符串存储在内存中,直到pandas读取了足够的csv文件行来进行限定猜测。

我认为pandas的默认做法是在猜测dtype之前读取1,000,000行。

解决方案

通过将dtype={'age':int}指定为.read_csv()的一个选项,可以让熊猫知道应该将年龄解释为数字。这为您节省了大量内存。

数据损坏的问题

但是,如果您的csv文件可能已损坏,则如下所示:

代码语言:javascript
复制
name, age, birthday
Alice, 30, 1985-01-01
Bob, 35, 1980-01-01
Charlie, 25, 1990-01-01
Dennis, 40+, None-Ur-Bz

然后,指定dtype={'age':int}将中断.read_csv()命令,因为它不能将"40+"转换为int。因此,请仔细清理您的数据!

在这里您可以看到,当以字符串形式保存浮点数时,pandas数据帧的内存使用率要高得多:

你自己试试吧

代码语言:javascript
复制
df = pd.DataFrame(pd.np.random.choice(['1.0', '0.6666667', '150000.1'],(100000, 10)))
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
# 224544 (~224 MB)

df = pd.DataFrame(pd.np.random.choice([1.0, 0.6666667, 150000.1],(100000, 10)))
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
# 79560 (~79 MB)
票数 32
EN

Stack Overflow用户

发布于 2017-11-11 04:00:10

我也遇到了同样的内存问题,简单地读取一个大小约为1 GB的制表符分隔的文本文件(超过550万条记录),这解决了内存问题:

代码语言:javascript
复制
df = pd.read_csv(myfile,sep='\t') # didn't work, memory error
df = pd.read_csv(myfile,sep='\t',low_memory=False) # worked fine and in less than 30 seconds

Spyder 3.2.3 Python 2.7.13 64位

票数 5
EN

Stack Overflow用户

发布于 2019-03-04 17:30:45

我在读取大的CSV文件时尝试了chunksize

代码语言:javascript
复制
reader = pd.read_csv(filePath,chunksize=1000000,low_memory=False,header=0)

read现在就是列表。我们可以迭代reader并写入/附加到新的csv,也可以执行任何操作

代码语言:javascript
复制
for chunk in reader:
    print(newChunk.columns)
    print("Chunk -> File process")
    with open(destination, 'a') as f:
        newChunk.to_csv(f, header=False,sep='\t',index=False)
        print("Chunk appended to the file")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17557074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档