内存错误和列表限制?

Tau*_*upi 65 python memory limits list

我需要为科学目的生产大型和大型(非常)矩阵(马尔可夫链).我执行微积分,我放入20301元素列表(=我的矩阵的一行).我需要内存中的所有数据继续下一步Markov步骤但我可以将它们存储在别处(例如文件),如果需要的话,即使它会减慢我的马尔可夫链步入.我的电脑(科学实验室):Bi-xenon 6核/ 12threads,12GB内存,操作系统:win64

  Traceback (most recent call last):
  File "my_file.py", line 247, in <module>
    ListTemp.append(calculus)
MemoryError
Run Code Online (Sandbox Code Playgroud)

微积分结果示例:9.233747520008198e-102(是的,超过1/9000)

存储第19766个元素时会引发错误:

ListTemp[19766]
1.4509421012263216e-103
Run Code Online (Sandbox Code Playgroud)

如果我走得更远

Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    ListTemp[19767]
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

所以这个列表在19767循环中有一个内存错误.

问题:

  1. 列表是否有内存限制?它是"按列表限制"还是"按脚本限制全局"?

  2. 如何绕过这些限制?任何可能的想法?

  3. 使用numpy,python64会有帮助吗?它们的内存限制是多少?其他语言怎么样?

G G*_*III 53

首先,看看 Python数组有多大?Numpy,长阵列的问题

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

  1. 如果您运行的是较旧的操作系统或强制进程使用有限内存的操作系统,则可能需要增加Python进程可以访问的内存量.
  2. 使用分块将列表分开.例如,执行列表的前1000个元素,pickle并将它们保存到磁盘,然后执行下一个1000.要使用它们,一次取消一个块,以便不会耗尽内存.这基本上与数据库用于处理比RAM更适合的数据的技术相同.

  • 32位进程的理论上限为4 GB内存,但如果你的操作系统也是32位,那么操作系统占用一些内存显然会少一些.分块会降低你的速度,但在某些情况下,你必须接受减速才能完成处理.你在那个名单中存储了什么?也许这有助于解释正在发生的事情. (2认同)

tho*_*mas 26

MemoryError您看到的例外是可用RAM耗尽的直接结果.这可能是由Windows(32位程序)施加的每个程序限制2GB 或计算机上缺少可用RAM引起的.(此链接指向上一个问题).

如果您使用64位的Windows副本,则应该能够使用64位的Python副本扩展2GB.

IndexError是因为Python MemoryError 在计算整个数组之前遇到了异常.这又是一个记忆问题.

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

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


MAK*_*MAK 8

Python没有内存限制.但是,MemoryError如果RAM耗尽,你会得到一个.你说你有20301个元素list.这似乎太小而不会导致简单数据类型(例如int)的内存错误,但如果每个元素本身都是一个占用大量内存的对象,那么你可能会耗尽内存.

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

如果不确切知道你想要做什么,很难说你能做些什么来避免达到极限.使用numpy可能有帮助.看起来你正在存储大量数据.可能您不需要在每个阶段存储所有内容.但是如果不知道就不可能说出来.

  • 与任何其他程序一样,Python使用整个虚拟内存,而不仅仅是物理内存(RAM).海报可以增加可用的交换内存(这是Windows中的文件和Linux中的分区). (2认同)
  • 你也可以在linux上使用交换文件.取自Arch Wiki:`#touch/swapfile``#fallocate -l 512M/swapfile``#dd if =/dev/zero of =/swapfile bs = 1M count = 512``#chmod 600/swapfile``# mkswap/swapfile``#swapon/swapfile``#echo"/ swapfile none swap defaults 0 0">>/etc/fstab` (2认同)