您的当前位置:首页正文

详解解决Pythonmemoryerror的问题(四种解决方案)

来源:画鸵萌宠网
详解解决Pythonmemoryerror的问题(四种解决⽅案)

昨天在⽤⽤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 = 1000chunks = []index=0while 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这个垃圾回收库,这样内存⾃然就⼀直清清爽爽啦~以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top