首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制多线程python进程的内存使用

控制多线程python进程的内存使用
EN

Stack Overflow用户
提问于 2015-07-09 22:49:15
回答 2查看 839关注 0票数 1

我需要控制当前python进程的内存使用情况。这个进程是一个多线程的python RPC服务器。

这些线程执行内存密集型工作(线程使用ctype调用内存密集型c库。所以这些python线程是真正并行的。)。

我计划通过延迟调用内存密集型函数来控制这个进程的内存使用量,如果线程发现当前内存使用量超过阈值的话。

此应用程序在freeBSD 9.2上运行。

我需要帮助

1)如何获取当前进程的内存大小?由于我将更频繁地执行此操作,因此我希望此调用是轻量级的。

2)这种控制内存使用的想法合理吗?

EN

回答 2

Stack Overflow用户

发布于 2015-07-09 23:01:46

如果您可以安装外部库,则可以使用psutil来监视系统性能。它非常轻量级,可以精确地测量内存,因此您应该能够调用它,而不会导致任何严重的性能问题。如果您想了解更深入的内存信息,有一个名为memory_profiler的相关库。它可以在这里找到,https://pypi.python.org/pypi/memory_profilerpsutil可以在这里找到:https://github.com/giampaolo/psutil

是的,您应该能够在Python中操作内存。在Python中,内存管理可以通过内存接口中的方法来完成。您可以根据需要释放和重新分配内存块。如果你想更深入地了解Python是如何在内部处理内存的,以及如何操作它,我推荐你访问Releasing memory in Python

票数 0
EN

Stack Overflow用户

发布于 2015-08-21 07:20:50

考虑到大多数程序都使用共享库,那么问题是内存大小是多少?让我们暂时假设您正在谈论resident set size

至少有两种方法可以找出答案;

  • ps -u
  • procstat -r <PID>

这两种情况的示例:

代码语言:javascript
复制
> ps -u
USER     PID %CPU %MEM    VSZ  RSS TT  STAT STARTED    TIME COMMAND
rsmith   820  0.0  0.0  10088  520 v0  I    Fri11PM 0:00.01 -tcsh (tcsh)
rsmith   823  0.0  0.0   9732   32 v0  I+   Fri11PM 0:00.00 /bin/sh /usr/local/bin/startx
rsmith   836  0.0  0.0  26152 1480 v0  I+   Fri11PM 0:00.00 xinit /home/rsmith/.xinitrc -- /usr/local/bi
rsmith   840  0.0  0.1 135996 4904 v0  S    Fri11PM 0:23.16 i3
rsmith   878  0.0  0.0  10088 1980  0  Ss   Fri11PM 0:00.74 -tcsh (tcsh)
rsmith  5091  0.0  0.0   9388 1168  0  R+    1:04AM 0:00.00 ps -u
rsmith 74939  0.0  0.1  10088 2268  1  Is+  Mon02PM 0:00.44 -tcsh (tcsh)

代码语言:javascript
复制
> procstat -r 820
  PID COMM             RESOURCE                          VALUE        
  820 tcsh             user time                    00:00:00.000000   
  820 tcsh             system time                  00:00:00.011079   
  820 tcsh             maximum RSS                             1840 KB
  820 tcsh             integral shared memory                  2728 KB
  820 tcsh             integral unshared data                   800 KB
  820 tcsh             integral unshared stack                  256 KB
  820 tcsh             page reclaims                            402   
  820 tcsh             page faults                               25   
  820 tcsh             swaps                                      0   
  820 tcsh             block reads                               58   
  820 tcsh             block writes                               0   
  820 tcsh             messages sent                              0   
  820 tcsh             messages received                          0   
  820 tcsh             signals received                           1   
  820 tcsh             voluntary context switches               105   
  820 tcsh             involuntary context switches               0

在这种情况下,procstat为您提供的信息最多。

procstat程序使用libprocstat来获取进程信息。所以你基本上有两个选择;

  1. 使用subprocess.check_output调用procstat,并解析其输出。
  2. 通过libprocstat.

使用ctypes获取信息

第一个选项可能是最简单的,第二个可能更轻量级。

关于控制内存,有两个方面;

Python

  • memory中的
  1. 内存使用率libraries/extensions.

中的使用率

您可以尝试通过主动del不再需要的-ing对象来最小化Python内存使用。在ctypes中,您可能必须为函数分配缓冲区(例如,使用ctypes.create_string_buffer)或数组来存储其数据。这些都是Python对象,可以这样处理。您可以调用gc.collect()来强制垃圾回收。

但有时库会返回指向它们所分配的数据结构的指针。这些通常必须通过C库中的free()或C库提供的特殊函数来释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31320974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档