详解解决Python memory error的问题(四种解决方案)


Posted in Python onAugust 08, 2019

昨天在用用Pycharm读取一个200+M的CSV的过程中,竟然出现了Memory Error!简直让我怀疑自己买了个假电脑,毕竟是8G内存i7处理器,一度怀疑自己装了假的内存条。。。。下面说一下几个解题步骤。。。。一般就是用下面这些方法了,按顺序试试。

一、逐行读取

如果你用pd.read_csv来读文件,会一次性把数据都读到内存里来,导致内存爆掉,那么一个想法就是一行一行地读它,代码如下:

data = []
with open(path, 'r',encoding='gbk',errors='ignore') as f:
  for line in f:
    data.append(line.split(','))
    
data = pd.DataFrame(data[0:100])

这就是先用with open把csv的每一行读成一个字符串,然后因为csv都是靠逗号分隔符来分割每列的数据的,那么通过逗号分割就可以把这些列都分离开了,然后把每一行的list都放到一个list中,形成二维数组,再转换成DataFrame。

这个方法有一些问题,首先读进来之后索引和列名都需要重新调整,其次很多数字的类型都发生了变化,变成了字符串,最后是最后一列会把换行符包含进去,需要用replace替换掉。

不知道为什么,用了这个操作之后,还是出现了Memory error的问题。基于这些缺点以及遗留问题,考虑第二种解决方案。

二、巧用pandas中read_csv的块读取功能

pandas设计时应该是早就考虑到了这些可能存在的问题,所以在read功能中设计了块读取的功能,也就是不会一次性把所有的数据都放到内存中来,而是分块读到内存中,最后再将块合并到一起,形成一个完整的DataFrame。

f = open(path)

data = pd.read_csv(path, sep=',',engine = 'python',iterator=True)
loop = True
chunkSize = 1000
chunks = []
index=0
while loop:
  try:
    print(index)
    chunk = data.get_chunk(chunkSize)
    chunks.append(chunk)
    index+=1

  except StopIteration:
    loop = False
    print("Iteration is stopped.")
print('开始合并')
data = pd.concat(chunks, ignore_index= True)

以上代码规定用迭代器分块读取,并规定了每一块的大小,即chunkSize,这是指定每个块包含的行数。

这个方法能够保持数据的类型,也不需要自己费心思去调整列名和index,比较方便。但不幸的是,我的还是出现了这个问题,如果你的用了这种方法还是出现memory error,你可以继续往下看。

三、扩充虚拟内存

我在运行代码的过程中发现,出现memory error错误的时候,其实我的内存只用到了40+%,所以其实不太可能会出现这个错误啊,所以我查了下,发现有说是内存被限制了,考虑关掉一些可能限制内存的软件啦,扩大虚拟内存啦,这些的。

扩大虚拟内存的方法(我的系统是win8,不过应该都大同小异):
1、打开 控制面板;
2、找到 系统 这一项;
3、找到 高级系统设置 这一项;
4、点击 性能 模块的 设置 按钮;
5、选择 高级面板,在 虚拟内存 模块点击更改;
6、记得 不要 选中“自动管理所有驱动器的分页文件大小”,然后选择一个驱动器,也就是一个盘,选中自定义大小,手动输入初始大小和最大值,当然,最好不要太大,更改之后能在查看盘的使用情况,不要丢掉太多空间。
7、都设置好之后,记得点击 “设置”, 然后再确定,否则无效,最后 重启电脑 就可以了。

悲剧的是我在设置完这一步之后还是出现了内存错误,到这一步就没有问题了的朋友就可以不用看下面一种解法了,如果还是有问题,可以接下来看。

四、更新Pandas和Numpy库为64位

如果你的Python用的是32位的,那么你的pandas和Numpy也只能是32位的,那么当你的内存使用超过2G时,就会自动终止内存。发现这个错误也是因为我察觉到报内存溢出的错误的时候,我的内存明明显示只用了40+%,然后错误提示是在pandas的core中,所以查了一下,发现原来还有这么个大坑。

解决方法就是:先检查一下你的python是多少位的,在shell中输入python,查看位数,如果是32位,那么就重装Python,装一个64位的,但同时你的库也需要重新装了。不过我执行完这一步之后,问题就完美解决了!

五、如果还有内存溢出的错

以上四种方法,按顺序逐一使用,到哪一步错误消失了就可以停止啦。当然了,如果你的内存显示使用达到了99%+,那么就是内存真的不够用,不是别的问题,如果不是数据量特别大,那就是写代码的时候的习惯问题,虽然Python有垃圾回收机制,但是有时候可能来不及回收,尤其是在循环迭代这些过程中,往往会循环完毕了才来得及收拾垃圾,所以记得及时把不要的变量del掉,或者用gc这个垃圾回收库,这样内存自然就一直清清爽爽啦~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
python读取xlsx的方法
Dec 25 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
pytorch 固定部分参数训练的方法
Aug 17 Python
Python数学形态学实例分析
Sep 06 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
requests在python中发送请求的实例讲解
Feb 17 Python
Django分页器的用法你都了解吗
May 26 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 Python
Python学习笔记之迭代器和生成器用法实例详解
Aug 08 #Python
pandas 选取行和列数据的方法详解
Aug 08 #Python
pandas 对日期类型数据的处理方法详解
Aug 08 #Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 #Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 #Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 #Python
Python实现直方图均衡基本原理解析
Aug 08 #Python
You might like
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
尽可能写"友好"的"Javascript"代码
2007/01/09 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
json的使用小结
2016/06/08 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python实现的简单算术游戏实例
2015/05/26 Python
python中学习K-Means和图片压缩
2017/11/20 Python
python获取代码运行时间的实例代码
2018/06/11 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
python实现文字版扫雷
2020/04/24 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
应届生自我鉴定
2013/12/11 职场文书
项目总经理岗位职责
2014/02/14 职场文书
倡议书范文格式
2014/05/12 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
2016新年感言
2015/08/03 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技