我有时会编写Python程序,这些程序在执行之前很难确定它将使用多少内存.因此,我有时会调用一个试图分配大量RAM的Python程序,导致内核大量交换并降低其他正在运行的进程的性能.
因此,我希望限制Python堆可以增加多少内存.达到限制时,程序可能会崩溃.最好的方法是什么?
如果重要,很多代码都是用Cython编写的,所以它应该考虑那里分配的内存.我没有与纯Python解决方案结合(它不需要是可移植的),所以在Linux上运行的任何东西都可以.
我在Ubuntu 18上在numpy中分配大型数组时遇到了一个问题,而在MacOS上却没有遇到同样的问题。
我想一个numpy的阵列形状分配内存(156816, 36, 53806)
使用
np.zeros((156816, 36, 53806), dtype='uint8')
Run Code Online (Sandbox Code Playgroud)
当我在Ubuntu OS上遇到错误时
>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
numpy.core._exceptions.MemoryError: Unable to allocate array with shape (156816, 36, 53806) and data type uint8
Run Code Online (Sandbox Code Playgroud)
我在MacOS上没有得到它:
>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
array([[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0], …Run Code Online (Sandbox Code Playgroud) 我正试图找到一种限制Python VM可用内存的方法,就像Java VM中的选项"-Xmx"一样.(想法是能够使用MemoryError异常)
我不确定这个选项是否存在但是可能有一个解决方案使用操作系统的命令来"隔离"进程及其内存.
谢谢.
我遇到了一个我似乎无法理解的记忆问题.
我在Windows 7 64位机器上运行8GB内存并运行32位python程序.
这些程序读取了5,118个压缩的numpy文件(npz).Windows报告磁盘上的文件占用1.98 GB
每个npz文件包含两个数据:'arr_0'的类型为np.float32,'arr_1'的类型为np.uint8
python脚本读取每个文件将其数据附加到两个列表中,然后关闭该文件.
在文件4284/5118周围,程序抛出一个MemoryException
但是,任务管理器说发生错误时python.exe*32的内存使用量是1,854,848K~ = 1.8GB.远低于我的8 GB限制,或者假定的32位程序的4GB限制.
在程序中我捕获内存错误并报告:每个列表的长度为4285.第一个列表包含总共1,928,588,480个float32的〜= 229.9 MB的数据.第二个列表包含12,342,966,272 uint8的〜= 1,471.3MB数据.
所以,一切似乎都在检查.除了我得到内存错误的部分.我绝对有更多的内存,它崩溃的文件大约是800KB,因此读取一个巨大的文件并没有失败.
此外,该文件未损坏.如果我事先没有耗尽所有的记忆,我可以读得很好.
为了让事情变得更加混乱,所有这一切似乎在我的Linux机器上运行良好(虽然它确实有16GB的内存,而不是我的Windows机器上的8GB),但是,它似乎并不是机器的RAM.造成这个问题.
为什么Python会抛出内存错误,当我预计它应该能够分配另外2GB的数据?
我目前正在使用一个函数制作极长的词典(用于比较DNA字符串),有时候我会得到MemoryError.有没有办法为Python分配更多内存,以便它可以同时处理更多数据?