我在使用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守护进程(使用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) 我有一个Django项目,其中多个进程正在访问后端mysql数据库.一个过程是创建记录,而另一个过程是尝试读取这些记录.我有一个问题,在我手动调用connection._commit()之前,尝试读取记录的第二个进程实际上找不到记录.
之前已经问过这个问题: 在Django中使用MySQLdb缓存MySQL响应中的问题
OP表示他解决了这个问题,但没有解释如何解决.任何人都可以对此有所了解吗?我希望能够在不手动调用_commit()的情况下访问记录.
谢谢,
阿西夫