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

Python 使用pandas read_csv时出现内存错误,python,windows,pandas,Python,Windows,Pandas,我正在尝试做一些相当简单的事情,将一个大的csv文件读入一个数据框 data = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2) 该代码要么失败,出现内存错误,要么永远无法完成 任务管理器中的Mem使用在506mb处停止,在进程中没有更改和CPU活动的5分钟后,我停止了它 我使用的是熊猫版本0.11.0 我知道文件解析器曾经存在内存问题,但根据的说法,这应该已经解决了 我试图读取的文件是366MB,如果我将

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

data = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2)
该代码要么失败,出现
内存错误
,要么永远无法完成

任务管理器中的Mem使用在506mb处停止,在进程中没有更改和CPU活动的5分钟后,我停止了它

我使用的是熊猫版本0.11.0

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

我试图读取的文件是366MB,如果我将文件压缩到较短的长度(25MB),上面的代码就可以工作

我还碰巧看到一个弹出窗口,告诉我它无法写入地址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 . . .
回溯(最近一次呼叫最后一次):
文件“F:\QA ALM\Python\new WIM data\new WIM data\new_WIM_data.py”,第25行,在
wimdata=pandas.read_csv(文件路径,头=0,sep=DELIMITER,skiprows=2
)
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\io\parsers.py”
,第401行,在语法分析器中
返回读取(文件路径或缓冲区,kwds)
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\io\parsers.py”
,第216行,已读
返回parser.read()
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\io\parsers.py”
,第643行,已读
df=数据帧(列=列,索引=索引)
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\core\frame.py”
,第394行,在_init中__
mgr=self.\u init\u dict(数据、索引、列、数据类型=dtype)
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\core\frame.py”
,第525行,在_init_dict中
dtype=dtype)
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\core\frame.py”
,第5338行,在_数组中_至_经理
从阵列(阵列、阵列名称、轴)返回创建块管理器
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\core\internal
.py”,第1820行,从数组创建块管理器
块=形成块(数组、名称、轴)
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\core\internal
.py“,第1872行,以表格_块形式
浮动\u块=\u多块化(浮动\u项,项)
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\core\internal
.py“,第1930行,多块化
块\项,值=\堆栈\数组(列表(tup\块),参考\项,数据类型)
文件“C:\Program Files\Python\Anaconda\lib\site packages\pandas\core\internal
.py”,第1962行,在堆栈数组中
堆叠=np.空(形状,dtype=dtype)
记忆者
按任意键继续。

一点背景知识——我试图让人们相信Python可以做与R相同的事情。为此,我尝试复制一个R脚本,它可以做到这一点

data <- read.table(paste(INPUTDIR,config[i,]$TOEXTRACT,sep=""), HASHEADER, DELIMITER,skip=2,fill=TRUE)

data虽然这是一个解决方案,但与其说是一个修复方案,不如说是一个解决方案,我会尝试将CSV转换为JSON(应该很简单),并使用
read\u JSON
方法-我一直以这种方式编写和读取相当大的JSON/数据帧(100MB),根本没有任何问题。

Pandas 0.12.0和NumPy 1.8.0没有错误

我已经成功地创建了一个大数据框,并将其保存到csv文件中,然后成功地读取了它。请看这个例子。该文件的大小为554MB(它甚至适用于1.1Gb文件,需要更长的时间才能生成1.1Gb文件,使用频率为30秒)。虽然我有4Gb的内存可用


我的建议是尝试更新熊猫。另一件可能有用的事情是尝试从命令行运行脚本,因为对于R,您没有使用Visual Studio(这已经在您的问题的注释中提出),因此它有更多可用的资源

当我在虚拟机中运行时,或者在内存非常有限的其他地方运行时,我也遇到了这个问题。它与pandas、numpy或csv无关,但如果您尝试使用更多的内存,即使是在python中,也总是会发生这种情况

你唯一的机会就是你已经尝试过的东西,试着把大的东西咬成小的碎片,放入记忆中

如果你曾经问过自己MapReduce是关于什么的,你会自己发现…MapReduce会尝试将块分布在多台机器上,你会尝试在一台机器上一台接一台地处理块

你发现区块文件的连接可能确实是个问题,也许在这个操作中需要一些副本…但最终这可能会在你当前的情况下节省你的时间,但是如果你的csv变大一点,你可能会再次撞到墙

也可能是因为pandas非常聪明,如果您使用它做一些事情,比如连接到一个大df,它实际上只会将单个数据块加载到内存中

您可以尝试以下几点:

  • 不要一次加载所有数据,而是将数据分成几部分
  • 据我所知,hdf5能够自动执行这些块,并且只加载程序当前工作的部分
  • 看看这些类型是否正确,字符串“0.111111”需要的内存比浮点值多
  • 实际上你需要什么,如果地址是一个字符串,你可能不需要它来进行数值分析
  • 数据库可以帮助访问和加载您实际需要的部分(例如,仅1%的活动用户)

我在Linux机器上使用Pandas,并面临许多内存泄漏问题,这些问题只有在从github克隆Pandas到最新版本后才能得到解决。

Windows内存限制 在Windows中使用32位版本时,python经常出现内存错误。这是因为默认情况下32位进程

降低内存使用率的技巧 如果您在windows中不使用32位python,但希望在读取csv文件时提高内存效率,那么有一个技巧

选择名为
dtype
的选项。这让熊猫们知道我生活在什么样的环境中
name, age, birthday
Alice, 30, 1985-01-01
Bob, 35, 1980-01-01
Charlie, 25, 1990-01-01
name, age, birthday
Alice, 30, 1985-01-01
Bob, 35, 1980-01-01
Charlie, 25, 1990-01-01
Dennis, 40+, None-Ur-Bz
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)
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
reader = pd.read_csv(filePath,chunksize=1000000,low_memory=False,header=0)
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")