python出现memory error_请问大神们Python处理数据遇到memory error怎么办?

要破这个东西,要先破你的算法。 先别说破这个词了。

梳理你的算法,避免三重循环, 避免大量使用字典的多次嵌套。

显然你的数据量巨大。还用这么耗内存,耗cpu的算法。只有算法改良了才能解决这个问题。即使给你c语编程,你都能把内存用光了。你把矩阵放在字典里,内存肯定吃不消。顺便说一下,你用的python应该是32位的。如果是64位的会好些。

在python里,大数据处理一定要减少字典使用。如果字典项超过一定值比为2万,就要小心。 字典主要是用来统计用,不用来计算。 建议你考虑numpy.array做。如果不想用它就用array,如果还不想可以用blist(第三方包),最差也要用list。字典虽然查找比list快,但是它耗更多内存。

比如你这个问题,你可以先考虑两步走。不要把算法放在一起,虽然效率高,但是后期维护成本高。

第一步计算“浏览过每种物品的人数”, 这个可以用字典。但是因为要做人与物品的关联,所以,应该是说错了。 应该是“计算某个浏览过某个物品”。

你这里与时间没有关系。算法应该没有计算“时间”加权。

我理解你的算法应该是用户浏览”两个物品时”,则累加两个物品同时浏览次数。

并将次数除以,用户分别浏览i,j次数乘积的开根方。 这本来是一个很简单的算法。 你弄太复杂了。

建议你这样。 你使用两个字典,分别这样

items_browsed_by_user[userid][product_id]

items_browsed_cross [userid][[product_id_i, product_id_j]]

记着在给items_browsed_cross [userid][(product_id_i, product_id_j)]赋值时。保证product_id_i < product_id_j

这样你只需要一半的内存就可以存i*j矩阵。因为先浏览i, 再j和先j再i, 结果是一样的。

最理想的办法是给userid编写一个编号,从0到number of users, 这样直接用数组就可以存放。不需要字典。 再给product_id编号用顺序号代替。 这样内存占用更少。只需要一个二维数组就可以存贮数据。

如果内存还不足够,就要引入稀疏矩阵。

如果还不足够,也可以的。每次计算,只计算一行。然后存贮到硬盘上。按行按列分别计算。这在大数据环境里很容易就做到了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值