为了账号安全,请及时绑定邮箱和手机立即绑定

内存错误和列表限制?

内存错误和列表限制?

叮当猫咪 2019-11-29 11:02:11
为了科学目的,我需要产生越来越大的(非常)矩阵(马尔可夫链)。我执行微积分,将其放入20301个元素的列表中(=矩阵的一行)。我需要将所有这些数据存储在内存中以继续进行下一步的马尔可夫步骤,但是如果需要,我可以将它们存储在其他位置(例如文件),即使这会减慢我的马尔可夫链的遍历速度。我的计算机(科学实验室):双氙气6核/ 12线程,每个12GB内存,操作系统:win64  Traceback (most recent call last):  File "my_file.py", line 247, in <module>    ListTemp.append(calculus)MemoryError微积分结果示例:9.233747520008198e-102(是,超过1/9000)存储第19766个元素时会引发错误:ListTemp[19766]1.4509421012263216e-103如果我走得更远Traceback (most recent call last):  File "<pyshell#21>", line 1, in <module>    ListTemp[19767]IndexError: list index out of range因此,此列表在19767循环中发生了内存错误。问题:列表有内存限制吗?是“按列表限制”还是“按脚本全局限制”?如何绕过那些限制?有什么想法吗?使用numpy,python64是否有帮助?它们的内存限制是多少?那其他语言呢?
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

首先,请参阅 Python数组可以达到多大?和Numpy,长数组问题


其次,唯一的实际限制来自您拥有的内存量以及系统如何存储内存引用。没有每个列表的限制,因此Python会一直运行直到内存耗尽。两种可能性:


如果您在较旧的OS上运行,或者在迫使进程使用有限数量的内存的操作系统上运行,则可能需要增加Python进程可以访问的内存数量。

使用分块将列表分开。例如,执行列表的前1000个元素,腌制并将其保存到磁盘,然后再进行下1000个。要使用它们,请一次释放一个块,以免耗尽内存。从本质上讲,这是数据库用来处理超出RAM容量的数据的相同技术。


查看完整回答
反对 回复 2019-11-29
?
慕标5832272

TA贡献1966条经验 获得超4个赞

MemoryError您看到的异常是可用RAM耗尽的直接结果。这可能是由于Windows(32位程序)对每个程序施加了2GB的限制,或者计算机上没有可用的RAM。(此链接是上一个问题)。


如果您使用的是Windows的64位副本,那么您应该能够使用Python的64位副本扩展2GB。


这IndexError可能是因为Python MemoryError 在计算整个数组之前遇到了异常。同样,这是一个内存问题。


为了解决这个问题,您可以尝试使用64位的Python副本,或者更好地找到将结果写入文件的方法。为此,请看numpy的内存映射数组。


您应该能够将整个计算集运行到这些数组之一中,因为实际数据将写入磁盘,并且只有一小部分存储在内存中。


查看完整回答
反对 回复 2019-11-29
?
慕容3067478

TA贡献1773条经验 获得超3个赞

Python没有施加内存限制。但是,MemoryError如果RAM用完,您将得到一个。您说您有20301个元素list。对于似乎简单的数据类型(例如int),这似乎太小而不会引起内存错误,但是如果每个元素本身都是一个占用大量内存的对象,则很可能内存不足。

IndexError然而,可能是造成因为你ListTemp已经得到了只有19767元(索引0到19766),和你想过去的最后一个元素的访问。

在不确切知道您要做什么的情况下很难说可以避免达到极限的方法。使用numpy可能会有所帮助。您似乎正在存储大量数据。可能您不需要在每个阶段都存储所有内容。但是,不知道是不可能说的。


查看完整回答
反对 回复 2019-11-29
  • 3 回答
  • 0 关注
  • 392 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号