用有限的内存运行Python进程

2024-04-20 07:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个Python命令行实用程序,它通过API调用来下载大文件,我们想看看程序在内存有限(小于等于1gb)的机器上运行时的表现。你知道吗

一种方法是使用虚拟化层(Docker容器或Vagrant虚拟盒)创建具有指定内存量的操作系统。但我对另一种方法感兴趣。你知道吗

我想知道是否有一种方法可以限制Python进程可用的内存量,这样我就可以运行命令行接口来进行API调用,但将其限制为最大内存(比如)512MB来测试内存不足的问题。你知道吗

正在寻找适用于Mac OS X(运行10.14+)或Linux的解决方案。你知道吗


Tags: 文件方法内存docker命令行程序实用程序机器
2条回答

如果您真的想在Python中实现这一点,您可以尝试查看resource doc,它有一些方法可以使用setrlimit()来设置这里列出的资源的限制,内存就是其中之一。不确定这是否有用。你知道吗

使用setrlimit设置最大内存大小

根据@Alexis Drakopoulos's answerresource模块可用于设置Python脚本使用的最大虚拟内存量,但需要注意的是,此方法仅适用于基于Linux的系统,而不适用于基于BSD的系统,如Mac OS X。你知道吗

要修改限制,请在Python脚本中添加以下对setrlimit的调用:

resource.setrlimit(resource.RLIMIT_AS, (soft_lim, hard_lim))

(其中软/硬限制以字节为单位,它们的值通常相等)。你知道吗

快速示例

下面是一个快速示例,它将内存限制为1 MB左右,然后由于内存错误而无法导入pandas

$ python
Python 3.6.9 (default, Nov  7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource

>>> print(resource.getrlimit(resource.RLIMIT_AS))
(-1, -1)

>>> resource.setrlimit(resource.RLIMIT_AS, (1000,1000))

>>> import pandas as pd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/vagrant/.local/lib/python3.6/site-packages/pandas/__init__.py", line 11, in <module>
  File "/home/vagrant/.local/lib/python3.6/site-packages/numpy/__init__.py", line 142, in <module>
  File "/home/vagrant/.local/lib/python3.6/site-packages/numpy/core/__init__.py", line 24, in <module>
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 674, in exec_module
  File "<frozen importlib._bootstrap_external>", line 779, in get_code
  File "<frozen importlib._bootstrap_external>", line 487, in _compile_bytecode
MemoryError
MemoryError

为什么这在BSD系统上不起作用?

如果您检查手册页中的getrlimitsetrlimit,您将看到一个RLIMIT_*变量列表-但是BSD和Linux之间的列表是不同的。Linux getrlimit/setrlimit man page列出了RLIMIT_AS,但是BSD getrlimit/setrlimit man page没有列出任何用于控制内存量的RLIMIT变量。因此,即使resource.RLIMIT_AS是在macosx上的resource模块中定义的,设置它对内核或进程可用的内存量没有影响。你知道吗

另见What do the two numbers returned by Python's resource.RLIMIT_VMEM (or resource.RLIMIT_AS) mean?

相关问题 更多 >