版权声明:本文为博主原创文章,遵循 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的问题(四种解决方案) - 高琳琳的博文...相关推荐

  1. python 海象运算符_科学网—[转载]海象运算符 := - 龚云国的博文

    PEP 572: Assignment Expressions 新增一种新语法形式::=,又称为"海象运算符"(为什么叫海象,看看这两个符号像不像颜表情),如果你用过 Go 语言, ...

  2. python 基因序列提取_科学网—简单的Python脚本提取对应位置基因序列(fasta文件) - 王彬忠的博文...

    最近,用Python脚本提取,在基因号已知,位置已知条件下,相对应位置的基因序列时发现,这样很简单但是很实用的脚本,在网上却比较难找.而且,能被找到的脚本,相对于具有初级编程能力的人而言,有点难.本人 ...

  3. anaconda中python的位置_科学网—查询Anaconda安装路径、安装包位置及授予访问权限 - 张伟的博文...

    (1)确认安装路径 输入以下命令: conda info --env 可以知道当前有哪些环境,以及环境路径: (2)Anaconda管理的包的位置 具体路径为F:\Anaconda\Lib\site- ...

  4. matlab surf颜色,科学网[转载]matlab中控制mesh或者surf的颜色

    科学网[转载]matlab中控制mesh或者surf的颜色 曲面的顏色越发柔順滑腻,del2 (Z) 根據數值微分來產生矩陣 Z 的 discrete Laplacian, Y,surf 及 mesh ...

  5. 解决声卡爆音/杂音的四种方法

       内容提要:解决声卡爆音/杂音的四种方法,放MP3和电影的时候,总是会出现"噼噼啪啪"的声音,电脑播放任何音频时都会有爆音的情况出现.电脑采用了英特尔酷睿II E4500的处理 ...

  6. beyond compare4过期解决方法_面试必备:缓存穿透、雪崩解决方案及缓存击穿的四种解决方案...

    前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到 ...

  7. Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 参考文章: (1)Java解决Hash(散列)冲突的四种方法--开放地址法 ...

  8. 宝塔面板屏蔽、去除、解决强制绑定手机账号的四种方法

    教程文档 从7.4.5版本开始,宝塔安装后首页强制绑定手机号码,虽然没有关闭按钮,但其实只是一个弹窗,并且只在首页提示(不排除之后官方改成其他页面也弹窗),不想绑定的用户可以直接修改面板首页文件即可关 ...

  9. python的安装包下载_科学网—[转载]python常用的安装包下载 - 林清莹的博文

    Python常用的安装包下载 1.首先应该下载dlib安装包(例如:dlib-19.8.1-cp36-cp36m-win_amd64.whl) 可以通过此网址进行下载对应的dlib包   https: ...

  10. linux计算圆周率程序,科学网—[转载]关于Linux中使用bc命令计算圆周率(π):可以计算上千位或上万位,顺便评测CPU的计算能力 - 张成岗的博文...

    Posted on 2020-12-19 20:28  520_1351  阅读(149)  评论(0)  编辑  收藏 Linux系统中,我们可以安装bc计算器用来计算pi值(π圆周率) 在玩的同时 ...

最新文章

  1. 成长的速度一定要超过父母老去的速度
  2. 面试:一个Java字符串到底有多少个字符?
  3. Python列表解析式总结
  4. 一步一步学JVM-垃圾回收器
  5. mysql和oracle的锁_关于数据库行锁与表锁的认识
  6. SH1B LMR62014XMFE/NOPB
  7. linux系统安装宝塔面板
  8. 【51单片机快速入门指南】4.4.2:Mahony AHRS 九轴姿态融合获取四元数、欧拉角
  9. node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  10. python 可变参数传递
  11. 罗永浩带货520鲜花礼盒再翻车:自掏腰包100多万,双倍赔偿
  12. 我帮公司财务写了个“群发工资条”的 Python 脚本!
  13. Entity Framework 小知识(一)
  14. 1.1.6版本Druid连接MSSQLServer 2008 R2报错The query timeout value -1 is not valid. #2210
  15. [233]树莓派裸机代码bootloader学习总结
  16. 远程连接软件TeamViewer
  17. win10台式机,耳机插入没有声音
  18. 异常处理 | manual close is not allowed over a Spring managed SqlSession
  19. 每周分享第 45 期
  20. 《Dreamweaver CS6 完全自学教程》笔记 第四章:创建站点

热门文章

  1. 氨基酸三字母转一个字母
  2. 前端工作中遇到的问题总结(一)
  3. omniPlan密匙
  4. 画二元函数即三维图像的函数及matlab代码
  5. Power Query零基础入门(Excel2021专业加强版)
  6. C#数字黑洞之一(水仙花数黑洞153)
  7. 统计推断——假设检验中 p 值的含义具体是什么?
  8. stata面板数据gmm回归_stata面板数据回归操作之GMM
  9. 广义矩方法(GMM)与动态面板数据简述
  10. 主成分分析(PCA)原理详解