小编Asi*_*man的帖子

Python内存占用量与堆大小

我在使用python脚本发出大型solr查询时遇到了一些内存问题.我正在使用solrpy库与solr服务器进行交互.该查询返回大约80,000条记录.发出查询后立即通过顶部气球查看到的python内存占用量为~190MB.

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
8225 root      16   0  193m 189m 3272 S  0.0 11.2   0:11.31 python
...
Run Code Online (Sandbox Code Playgroud)

此时,通过heapy查看的堆配置文件如下所示:

Partition of a set of 163934 objects. Total size = 14157888 bytes.   
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  80472  49  7401384  52   7401384  52 unicode
     1  44923  27  3315928  23  10717312  76 str
...
Run Code Online (Sandbox Code Playgroud)

unicode对象表示查询中记录的唯一标识符.需要注意的一点是,总堆大小只有14MB,而python占用190MB的物理内存.一旦存储查询结果的变量超出范围,堆配置文件就会正确反映垃圾收集:

Partition of a set of 83586 …
Run Code Online (Sandbox Code Playgroud)

python solr memory-leaks

10
推荐指数
1
解决办法
4649
查看次数

在python守护程序中使用多处理模块时出错

在python守护进程(使用python-daemon)中使用多处理模块时,我收到以下错误:

Traceback (most recent call last):
  File "/usr/local/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/local/lib/python2.6/multiprocessing/util.py", line 262, in _exit_function
    for p in active_children():
  File "/usr/local/lib/python2.6/multiprocessing/process.py", line 43, in active_children
    _cleanup()
  File "/usr/local/lib/python2.6/multiprocessing/process.py", line 53, in _cleanup
    if p._popen.poll() is not None:
  File "/usr/local/lib/python2.6/multiprocessing/forking.py", line 106, in poll
    pid, sts = os.waitpid(self.pid, flag)
OSError: [Errno 10] No child processes

守护进程(父进程)生成许多进程(子进程),然后定期轮询进程以查看它们是否已完成.如果父进程检测到其中一个进程已完成,则会尝试重新启动该进程.正是在这一点上提出了上述异常.似乎一旦其中一个进程完成,涉及多处理模块的任何操作都将生成此异常.如果我在非守护程序python脚本中运行相同的代码,它将执行,没有任何错误.

编辑:

示例脚本

from daemon import runner

class DaemonApp(object):
    def __init__(self, pidfile_path, run):
        self.pidfile_path = pidfile_path
        self.run …
Run Code Online (Sandbox Code Playgroud)

python daemon multiprocessing

6
推荐指数
2
解决办法
4325
查看次数

访问Django db后端的多个进程; 记录直到手动调用_commit才显示

我有一个Django项目,其中多个进程正在访问后端mysql数据库.一个过程是创建记录,而另一个过程是尝试读取这些记录.我有一个问题,在我手动调用connection._commit()之前,尝试读取记录的第二个进程实际上找不到记录.

之前已经问过这个问题: 在Django中使用MySQLdb缓存MySQL响应中的问题

OP表示他解决了这个问题,但没有解释如何解决.任何人都可以对此有所了解吗?我希望能够在不手动调用_commit()的情况下访问记录.

谢谢,

阿西夫

mysql django

5
推荐指数
1
解决办法
908
查看次数

标签 统计

python ×2

daemon ×1

django ×1

memory-leaks ×1

multiprocessing ×1

mysql ×1

solr ×1