Python memory error(四种解决方案)
2026/9/23 13:14:20 网站建设 项目流程

昨天, 在读取一个200多M的CSV时, 出现了状况, 竟然是Error!这真让我怀疑自己买的电脑有问题, 毕竟电脑是8G内存i7处理器, 我甚至一度怀疑自己装的内存条是假的。下面说一说几个解题的步骤, 一般用下面这些方法, 按顺序去尝试。

一、逐行读取

如若你运用pd.去读取文件, 将会一回就把数据通通读取至内存当中, 致使内存出现爆掉的情况, 那么有一种想法便是逐行式地来读取它, 代码为如下这般:

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里面, 构成二维数组, 进而实现转换。

该方法存在些许问题, 其一, 读入之后, 索引以及列名均需再度调整, 其二, 诸多数字的类型产生了改变, 转变为字符串, 其三, 最后一列会将换行符涵盖其中, 需加以替换掉。

不清楚究竟是为何, 在运用了此项操作以后, 却依旧出现了error方面的问题。鉴于这些存在的缺点以及遗留下来的问题, 来思考第二种解决方案。

二、巧用中的块读取功能

进行设计之际, 应该是早就针对这些有可能存在的问题予以考虑了, 所以在read功能里面进行了块读取功能的设计, 也就是说, 不会把所有的数据一次性都放置到内存当中来, 而是分块将其读到内存里面, 最后再把块合并在一起, 形成一个完整的。

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)

上面所涉及到的代码, 做出了这样的规定, 要运用迭代器进行分块读取, 还针对每一块的大小作了规定, 具体来说,也就是, 这其实是明示了每个块所容纳行数的指定呀。

此种方法具备维持数据类型功能, 且无需自身耗费心力去调剂列名以及 index, 相对便利些。然而, 令人遗憾的是, 在我身上依旧出现了此问题, 要是你运用了这种方法同样出现 error, 那么你能够继续往下瞧。

三、扩充虚拟内存

在我开展代码运行行动期间察觉到, 于error纠错情况浮现之际, 实际上我的存储器所占比例仅为40+%, 因而着实较难出现此错误呀, 所以我进行了一番查证, 寻得有观点提及是存储器受到了约束, 思索着将一部分兴许会对存储器构成限制的程序予以关闭, 扩充虚拟存储器之类的。

进行扩大虚拟内存操作的办法, 我的操作系统是win8, 然而想必都是大致相同没有太大差异的:

1、打开 控制面板;

2、找到 系统 这一项;

3、找到 高级系统设置 这一项;

4、点击 性能 模块的 设置 按钮;

5、选择 高级面板,在 虚拟内存 模块点击更改;

6、记住, 别去选中“自动管理所有驱动器的分页文件大小”, 接着挑选出一个驱动器, 简单讲就是一个盘, 再选中自定义大小, 手动输入初始大小以及最大值, 当然啦, 最好别设置得太大, 更改完之后能查看盘的使用状况, 千万不要丢掉过多空间。

7、于各项均已妥善设置完毕之后, 要记着去点击那个被称作 “设置” 的选项, 跟进后进行确定的操作, 不然的话便不会产生预期的效果, 最终通过重新启动电脑的方式便可达成目的了。

悲摧的是, 我在完成这一步设置之后, 依旧出现了内存错误, 到这一步不存在问题的朋友, 便能够不必去看下面一种解法了, 要是仍然存在问题, 那么可以接着往下看。

四、更新和Numpy库为64位

要是你所使用的是32位的, 那般你的以及Numpy同样只能是32位的, 如此一来, 当你的内存使用超出2G之际, 便会自动终止内存。察觉到这个错误是由于我留意到报内存溢出错误之时, 我的内存明明表明只用了40 + %这么个情况, 并且错误提示处在core里头, 于是去查询了一番, 发觉原来存在这样一个大坑。

操作办法是这样的, 首先去核查一下你所使用的那是什么位的, 于shell当中键入内容, 去查看其位数情况。假若是32位的话, 那就重新进行安装操作, 安装一个是64位的, 但是此同时你的库同样得重新予以安装才行。紧接着我执行完毕这一项step往后呵, 问题就得到了无比周全完美的解决了呀!

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

第一种和第二种等四种方法, 依照固定顺序逐个依次地运用, 抵达哪一个步骤错误不再出现了之时便能够终止。当然, 要是你的内存呈现出使用程度达到了99%以上, 那么这就是内存确实不够用, 并非其他方面问题, 要是并非数据量特别庞大之情形, 那便是编写代码之际的习惯方面问题, 尽管存在垃圾回收机制, 然而有时候可能来不及去进行回收, 特别是在循环迭代这些进程当中, 常常会在循环结束了之后才来得及去清理垃圾, 所以要记得及时地将不需要的变量删除掉, 或者借助gc这个用于垃圾回收的库, 如此一来内存自然而然就始终保持清清爽爽的状态~

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询