Python:MemoryError 10
运行下面这行代码时报MemoryError了:x=np.array([[vocabulary[word]forwordinsentence]forsentenceinse...
运行下面这行代码时报MemoryError了:
x = np.array([[vocabulary[word] for word in sentence] for sentence in sentences])
求大神指导该怎么改进这句话
确定python是64位的,文本数据集并没有特别的大 展开
x = np.array([[vocabulary[word] for word in sentence] for sentence in sentences])
求大神指导该怎么改进这句话
确定python是64位的,文本数据集并没有特别的大 展开
3个回答
展开全部
要破这个东西,要先破你的算法。 先别说破这个词了。
梳理你的算法,避免三重循环, 避免大量使用字典的多次嵌套。
显然你的数据量巨大。还用这么耗内存,耗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编号用顺序号代替。 这样内存占用更少。只需要一个二维数组就可以存贮数据。
如果内存还不足够,就要引入稀疏矩阵。
如果还不足够,也可以的。每次计算,只计算一行。然后存贮到硬盘上。按行按列分别计算。这在大数据环境里很容易就做到了。
梳理你的算法,避免三重循环, 避免大量使用字典的多次嵌套。
显然你的数据量巨大。还用这么耗内存,耗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编号用顺序号代替。 这样内存占用更少。只需要一个二维数组就可以存贮数据。
如果内存还不足够,就要引入稀疏矩阵。
如果还不足够,也可以的。每次计算,只计算一行。然后存贮到硬盘上。按行按列分别计算。这在大数据环境里很容易就做到了。
2017-12-11 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
在用Python处理大数据时,本来16G的内存,内存还没使用四分之一就开始报MemoryError的错误,后来才知道32bit的Python使用内存超过2G之后,就报这个错误,还没有其他的提示消息。果断换64bit的Python。
一开始安装32bit的Python,是因为numpy和scipy官方版本只支持32bit的,后来又找到了非官方的版本http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
wheel文件安装时出现:Fatal error in launcher: Unable to create process using '“”C:\Program Files (x86)\Python33\python.exe“” “C:\Program Files (x86)\Python33\pip.exe”
在http://stackoverflow.com/questions/24627525/fatal-error-in-launcher-unable-to-create-process-using-c-program-files-x86上找到解决方法:
python -m pip install XXX
一开始安装32bit的Python,是因为numpy和scipy官方版本只支持32bit的,后来又找到了非官方的版本http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
wheel文件安装时出现:Fatal error in launcher: Unable to create process using '“”C:\Program Files (x86)\Python33\python.exe“” “C:\Program Files (x86)\Python33\pip.exe”
在http://stackoverflow.com/questions/24627525/fatal-error-in-launcher-unable-to-create-process-using-c-program-files-x86上找到解决方法:
python -m pip install XXX
追问
我的python是64位的。。。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看着没错。。。
你把里面的东西先拿出来呗,看有没有错误
[[vocabulary[word] for word in sentence] for sentence in sentences]
你把里面的东西先拿出来呗,看有没有错误
[[vocabulary[word] for word in sentence] for sentence in sentences]
更多追问追答
追问
请问该怎么展开成等价的代码?
追答
直接执行
x = [[vocabulary[word] for word in sentence] for sentence in sentences]
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询