pythonmemoryerror
⑴ python实现协同过滤推荐算法,用的大一些的数据集就报错MemoryError
python虽然易用,但是内存占用比较多;所以如果你有C/C++/Java基础,考虑用这些语言来实现;
CF算法需要计算大量的相似度,如果能把中间结果存起来,或者简化计算过程(如,你可能会重复计算一个item的均值)可以省下不少内存;(个人试过计算1w个用户Pearson是没问题的)
如果内存实在不够用,那就用时间换空间,把中间计算结果分成小文件存到磁盘上,用的时候再读取。
供参考。
⑵ Python:MemoryError
要破这个东西,要先破你的算法。 先别说破这个词了。
梳理你的算法,避免三重循环, 避免大量使用字典的多次嵌套。
显然你的数据量巨大。还用这么耗内存,耗CPU的算法。只有算法改良了才能解决这个问题。即使给你C语编程,你都能把内存用光了。你把矩阵放在字典里,内存肯定吃不消。顺便说一下,你用的python应该是32位的。如果是64位的会好些。
在python里,大数据处理一定要减少字典使用。如果字典项超过一定值比为2万,就要小心。 字典主要是用来统计用,不用来计算。 建议你考虑numpy.array做。如果不想用它就用Array,如果还不想可以用blist(第三方包),最差也要用list。字典虽然查找比list快,但是它耗更多内存。
比如你这个问题,你可以先考虑两步走。不要把算法放在一起,虽然效率高,但是后期维护成本高。
第一步计算“浏览过每种物品的人数”, 这个可以用字典。但是因为要做人与物品的关联,所以,应该是说错了。 应该是“计算某个浏览过某个物品”。
你这里与时间没有关系。算法应该没有计算“时间”加权。
我理解你的算法应该是用户浏览”两个物品时”,则累加两个物品同时浏览次数。
并将次数除以,用户分别浏览i,j次数乘积的开根方。 这本来是一个很简单的算法。 你弄太复杂了。
建议你这样。 你使用两个字典,分别这样
items_browsed_by_user[userid][proct_id]
items_browsed_cross [userid][[proct_id_i, proct_id_j]]
记着在给items_browsed_cross [userid][(proct_id_i, proct_id_j)]赋值时。保证proct_id_i < proct_id_j
这样你只需要一半的内存就可以存i*j矩阵。因为先浏览i, 再j和先j再i, 结果是一样的。
最理想的办法是给userid编写一个编号,从0到number of users, 这样直接用数组就可以存放。不需要字典。 再给proct_id编号用顺序号代替。 这样内存占用更少。只需要一个二维数组就可以存贮数据。
如果内存还不足够,就要引入稀疏矩阵。
如果还不足够,也可以的。每次计算,只计算一行。然后存贮到硬盘上。按行按列分别计算。这在大数据环境里很容易就做到了。
⑶ 请问大神们Python处理数据遇到memory error怎么办
items=[[0,16],[0,34],[10,15],[10,28],[20,35],[20,58],[34,13],[34,18],[34,20]]
while1:
tmps=[(a,b)forainitemsforbinitemsifa[-1]==b[0]]
ifnottmps:
break
tmps2=[(a,b)foraintmpsforbintmpsifa[-1]==b[0]]
foriintmps2:
tmps.remove(i[1])
fora,bintmps:
items.append(a+b[1:])
ifainitems:
items.remove(a)
ifbinitems:
items.remove(b)
print(items)
你的代码没法看, 直接给你重写了个。
如果items的元素能用元组表示的话,通过元组和集合,能更快点。
⑷ python 问题求解:memoryError的问题!
其实,解决这种问题的策略无非两种策略:
1、换用内存更大的服务器。
2、使用更大的物理空间来牺牲性能,你可以将中间结果或者临时结果在计算进行到一定程度的时候存储进入临时文件,然后在使用到相应的数据时候再取用,当然这样非常损失性能,当年我做生物信息学方面的时候遇到这样的问题。只能用数以千计的临时文件进行暂时缓存。
⑸ 如何在Python中解决MemoryError问题
通常不会遇到这个问题。python解决小问题不会有memory error
可能是使用了大对象也可能是使用了递归。没有合适规划临时或者是堆栈数据的数量。
那么有问题大部分是因为dict或者是list太大了。解决办法是使用优化过的数据结构,比如blist,或者是直接使用numpy的数组,array数据结构等等。
解决办法多。还可以使用64位版本。其实意义不大。python自己不需要管理大内存。也不需要大内存操作。
所以要用分布式架构解决问题。把问题分解成500MB以下的小问题,这样即使是32位的python也可以轻松完成。
内存管理的事情还是交给 C, C++这样的程序比较合适。2GB以下可以使用共享内存。 如果超过了,比如8,16, 96gb等。可以考虑使用数据库去管理。
如果你一定要用大对象也没有关系,其实效率也是挺高的。只是算法要优化。
⑹ python出现MemoryError
要破这个东西,要先破你的算法。 先别说破这个词了。
梳理你的算法,避免三重循环, 避免大量使用字典的多次嵌套。
显然你的数据量巨大。还用这么耗内存,耗CPU的算法。只有算法改良了才能解决这个问题。即使给你C语编程,你都能把内存用光了。你把矩阵放在字典里,内存肯定吃不消。顺便说一下,你用的python应该是32位的。如果是64位的会好些。
在python里,大数据处理一定要减少字典使用。如果字典项超过一定值比为2万,就要小心。 字典主要是用来统计用,不用来计算。 建议你考虑numpy.array做。如果不想用它就用Array,如果还不想可以用blist(第三方包),最差也要用list。字典虽然查找比list快,但是它耗更多内存。
比如你这个问题,你可以先考虑两步走。不要把算法放在一起,虽然效率高,但是后期维护成本高。
第一步计算“浏览过每种物品的人数”, 这个可以用字典。但是因为要做人与物品的关联,所以,应该是说错了。 应该是“计算某个浏览过某个物品”。
你这里与时间没有关系。算法应该没有计算“时间”加权。
我理解你的算法应该是用户浏览”两个物品时”,则累加两个物品同时浏览次数。
并将次数除以,用户分别浏览i,j次数乘积的开根方。 这本来是一个很简单的算法。 你弄太复杂了。
建议你这样。 你使用两个字典,分别这样
items_browsed_by_user[userid][proct_id]
items_browsed_cross [userid][[proct_id_i, proct_id_j]]
记着在给items_browsed_cross [userid][(proct_id_i, proct_id_j)]赋值时。保证proct_id_i < proct_id_j
这样你只需要一半的内存就可以存i*j矩阵。因为先浏览i, 再j和先j再i, 结果是一样的。
最理想的办法是给userid编写一个编号,从0到number of users, 这样直接用数组就可以存放。不需要字典。 再给proct_id编号用顺序号代替。 这样内存占用更少。只需要一个二维数组就可以存贮数据。
如果内存还不足够,就要引入稀疏矩阵。
如果还不足够,也可以的。每次计算,只计算一行。然后存贮到硬盘上。按行按列分别计算。这在大数据环境里很容易就做到了。