我在使用 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
...
此时,通过 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
...
unicode 对象表示来自查询的记录的唯一标识符。需要注意的一点是,总堆大小只有 14MB,而 python 占用了 190MB 的物理内存。一旦存储查询结果的变量超出范围,堆配置文件就会正确反映垃圾收集:
Partition of a set of 83586 objects. Total size = 6437744 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 44928 54 3316108 52 3316108 52 str
但是,内存占用保持不变:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8225 root 16 0 195m 192m 3432 S 0.0 11.3 0:13.46 python
...
为什么python的物理内存占用和python堆的大小有这么大的差距?