)
昨天, 在读取一个200多M的CSV时, 出现了状况, 竟然是Error这真让我怀疑自己买的电脑有问题, 毕竟电脑是8G内存i7处理器, 我甚至一度怀疑自己装的内存条是假的。下面说一说几个解题的步骤, 一般用下面这些方法, 按顺序去尝试。一、逐行读取如若你运用pd.去读取文件, 将会一回就把数据通通读取至内存当中, 致使内存出现爆掉的情况, 那么有一种想法便是逐行式地来读取它, 代码为如下这般:data [] with open(path, r,encodinggbk,errorsignore) 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,iteratorTrue) loop True chunkSize 1000 chunks [] index0 while loop: try: print(index) chunk data.get_chunk(chunkSize) chunks.append(chunk) index1 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这个用于垃圾回收的库, 如此一来内存自然而然就始终保持清清爽爽的状态~