python程序memory error_科学网—[转载]解决Python memory error的问题(四种解决方案) - 高琳琳的博文...
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39750084/article/details/81501395
(作者:陈玓玏)
分享一个朋友的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助http://www.captainbed.net/luanpeng
博客推荐:http://www.data-master.net/
昨天在用用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位的,但同时你的库也需要重新装了。不过我执行完这一步之后,问题就完美解决了!
===================
如何查看自己的python是多少位?进入python交互界面 比如:python3.6
输入import platform
再输入platform.architecture()
====================
五、如果还有内存溢出的错
以上四种方法,按顺序逐一使用,到哪一步错误消失了就可以停止啦。当然了,如果你的内存显示使用达到了99%+,那么就是内存真的不够用,不是别的问题,如果不是数据量特别大,那就是写代码的时候的习惯问题,虽然Python有垃圾回收机制,但是有时候可能来不及回收,尤其是在循环迭代这些过程中,往往会循环完毕了才来得及收拾垃圾,所以记得及时把不要的变量del掉,或者用gc这个垃圾回收库,这样内存自然就一直清清爽爽啦~
————————————————
版权声明:本文为CSDN博主「小白白白又白cdllp」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39750084/article/details/81501395
转载本文请联系原作者获取授权,同时请注明本文来自高琳琳科学网博客。
链接地址:http://blog.sciencenet.cn/blog-1969089-1207842.html
上一篇:attention-based papers accepted by MICCAI 19
下一篇:Draw figures with Python
python程序memory error_科学网—[转载]解决Python memory error的问题(四种解决方案) - 高琳琳的博文...相关推荐
- python 海象运算符_科学网—[转载]海象运算符 := - 龚云国的博文
PEP 572: Assignment Expressions 新增一种新语法形式::=,又称为"海象运算符"(为什么叫海象,看看这两个符号像不像颜表情),如果你用过 Go 语言, ...
- python 基因序列提取_科学网—简单的Python脚本提取对应位置基因序列(fasta文件) - 王彬忠的博文...
最近,用Python脚本提取,在基因号已知,位置已知条件下,相对应位置的基因序列时发现,这样很简单但是很实用的脚本,在网上却比较难找.而且,能被找到的脚本,相对于具有初级编程能力的人而言,有点难.本人 ...
- anaconda中python的位置_科学网—查询Anaconda安装路径、安装包位置及授予访问权限 - 张伟的博文...
(1)确认安装路径 输入以下命令: conda info --env 可以知道当前有哪些环境,以及环境路径: (2)Anaconda管理的包的位置 具体路径为F:\Anaconda\Lib\site- ...
- matlab surf颜色,科学网[转载]matlab中控制mesh或者surf的颜色
科学网[转载]matlab中控制mesh或者surf的颜色 曲面的顏色越发柔順滑腻,del2 (Z) 根據數值微分來產生矩陣 Z 的 discrete Laplacian, Y,surf 及 mesh ...
- 解决声卡爆音/杂音的四种方法
内容提要:解决声卡爆音/杂音的四种方法,放MP3和电影的时候,总是会出现"噼噼啪啪"的声音,电脑播放任何音频时都会有爆音的情况出现.电脑采用了英特尔酷睿II E4500的处理 ...
- beyond compare4过期解决方法_面试必备:缓存穿透、雪崩解决方案及缓存击穿的四种解决方案...
前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到 ...
- Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 参考文章: (1)Java解决Hash(散列)冲突的四种方法--开放地址法 ...
- 宝塔面板屏蔽、去除、解决强制绑定手机账号的四种方法
教程文档 从7.4.5版本开始,宝塔安装后首页强制绑定手机号码,虽然没有关闭按钮,但其实只是一个弹窗,并且只在首页提示(不排除之后官方改成其他页面也弹窗),不想绑定的用户可以直接修改面板首页文件即可关 ...
- python的安装包下载_科学网—[转载]python常用的安装包下载 - 林清莹的博文
Python常用的安装包下载 1.首先应该下载dlib安装包(例如:dlib-19.8.1-cp36-cp36m-win_amd64.whl) 可以通过此网址进行下载对应的dlib包 https: ...
- linux计算圆周率程序,科学网—[转载]关于Linux中使用bc命令计算圆周率(π):可以计算上千位或上万位,顺便评测CPU的计算能力 - 张成岗的博文...
Posted on 2020-12-19 20:28 520_1351 阅读(149) 评论(0) 编辑 收藏 Linux系统中,我们可以安装bc计算器用来计算pi值(π圆周率) 在玩的同时 ...
最新文章
- 成长的速度一定要超过父母老去的速度
- 面试:一个Java字符串到底有多少个字符?
- Python列表解析式总结
- 一步一步学JVM-垃圾回收器
- mysql和oracle的锁_关于数据库行锁与表锁的认识
- SH1B LMR62014XMFE/NOPB
- linux系统安装宝塔面板
- 【51单片机快速入门指南】4.4.2:Mahony AHRS 九轴姿态融合获取四元数、欧拉角
- node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
- python 可变参数传递
- 罗永浩带货520鲜花礼盒再翻车:自掏腰包100多万,双倍赔偿
- 我帮公司财务写了个“群发工资条”的 Python 脚本!
- Entity Framework 小知识(一)
- 1.1.6版本Druid连接MSSQLServer 2008 R2报错The query timeout value -1 is not valid. #2210
- [233]树莓派裸机代码bootloader学习总结
- 远程连接软件TeamViewer
- win10台式机,耳机插入没有声音
- 异常处理 | manual close is not allowed over a Spring managed SqlSession
- 每周分享第 45 期
- 《Dreamweaver CS6 完全自学教程》笔记 第四章:创建站点