xmlrpclib修补程序以减少其内存消耗
lxmlrpc_monke的Python项目详细描述
lxmlrpc-xmlrpclib修补程序
这个模块monkeypatch python的xmlrpclib使用基于lxml的解析器 减少大型xmlrpc请求/响应(100+mb)的内存消耗
注
此模块仅对*python2.7*有用。
如果您受到xmlrpclib的high memory consumption的困扰,请仅使用
使用量
要使用此模块,请执行以下操作
importxmlrpclibfromlxmlrpc_monkeyimportpatch_xmlrpclib# This line will monkey-patch xmlrpclib to use lxml for parserpatch_xmlrpclib()
基准(如何运行)
运行基准:
- 安装memory_profiler
- 使用python generate_data.py --path <demo data path> --size 50000000 准备数据
- 使用python benchmark.py --path <demo data path>
基准测试结果(50 MB(实际65 MB)数据文件)
看看xmlrpclib的`loads`函数中的`p.feed(data)`调用
*正在运行未修补的加载* 文件名:usr/lib/python2.7/xmlrpclib.py *运行修补加载* 文件名:usr/lib/python2.7/xmlrpclib.py 文件名:bechmark.pyLine # Mem usage Increment Line Contents 1134 104.7 MiB 0.0 MiB def loads(data, use_datetime=0): 1135 “”“data -> unmarshalled data, method name 1136 1137 Convert an XML-RPC packet to unmarshalled data plus a method 1138 name (None if not present). 1139 1140 If the XML-RPC packet represents a fault condition, this function 1141 raises a Fault exception. 1142 “”“ 1143 104.7 MiB 0.0 MiB p, u = getparser(use_datetime=use_datetime) >1144 622.4 MiB 517.7 MiB p.feed(data) 1145 558.0 MiB -64.4 MiB p.close() 1146 558.0 MiB 0.0 MiB return u.close(), u.getmethodname() Line # Mem usage Increment Line Contents 1134 106.9 MiB 0.0 MiB def loads(data, use_datetime=0): 1135 “”“data -> unmarshalled data, method name 1136 1137 Convert an XML-RPC packet to unmarshalled data plus a method 1138 name (None if not present). 1139 1140 If the XML-RPC packet represents a fault condition, this function 1141 raises a Fault exception. 1142 “”“ 1143 106.9 MiB 0.0 MiB p, u = getparser(use_datetime=use_datetime) >1144 235.9 MiB 129.0 MiB p.feed(data) 1145 171.5 MiB -64.4 MiB p.close() 1146 171.5 MiB 0.0 MiB return u.close(), u.getmethodname() Line # Mem usage Increment Line Contents 13 104.7 MiB 0.0 MiB @profile 14 def bench_load(xmldata): 15 104.7 MiB 0.0 MiB print (“Running unpatched loads”) 16 106.9 MiB 2.2 MiB loads(xmldata) 17 18 106.9 MiB 0.0 MiB lxmlrpc.patch_xmlrpclib() 19 20 106.9 MiB 0.0 MiB print (“Running patched loads”) 21 107.1 MiB 0.2 MiB loads(xmldata)
基准测试结果(100 MB(实际129 MB)数据文件)
*正在运行未修补的加载*
-
文件名:usr/lib/python2.7/xmlrpclib.py
Line # | Mem usage | Increment | Line Contents |
---|---|---|---|
1134 | 169.2 MiB | 0.0 MiB | def loads(data, use_datetime=0): |
1135 | “”“data -> unmarshalled data, method name | ||
1136 | |||
1137 | Convert an XML-RPC packet to unmarshalled data plus a method | ||
1138 | name (None if not present). | ||
1139 | |||
1140 | If the XML-RPC packet represents a fault condition, this function | ||
1141 | raises a Fault exception. | ||
1142 | “”“ | ||
1143 | 169.2 MiB | 0.0 MiB | p, u = getparser(use_datetime=use_datetime) |
>1144 | 1203.0 MiB | 1033.8 MiB | p.feed(data) |
1145 | 1074.2 MiB | -128.8 MiB | p.close() |
1146 | 1074.2 MiB | 0.0 MiB | return u.close(), u.getmethodname() |
*运行修补加载*
-
文件名:usr/lib/python2.7/xmlrpclib.py
Line # | Mem usage | Increment | Line Contents |
---|---|---|---|
1134 | 171.6 MiB | 0.0 MiB | def loads(data, use_datetime=0): |
1135 | “”“data -> unmarshalled data, method name | ||
1136 | |||
1137 | Convert an XML-RPC packet to unmarshalled data plus a method | ||
1138 | name (None if not present). | ||
1139 | |||
1140 | If the XML-RPC packet represents a fault condition, this function | ||
1141 | raises a Fault exception. | ||
1142 | “”“ | ||
1143 | 171.6 MiB | 0.0 MiB | p, u = getparser(use_datetime=use_datetime) |
>1144 | 429.4 MiB | 257.8 MiB | p.feed(data) |
1145 | 300.6 MiB | -128.8 MiB | p.close() |
1146 | 300.6 MiB | 0.0 MiB | return u.close(), u.getmethodname() |
文件名:bechmark.py
Line # | Mem usage | Increment | Line Contents |
---|---|---|---|
13 | 169.2 MiB | 0.0 MiB | @profile |
14 | def bench_load(xmldata): | ||
15 | 169.2 MiB | 0.0 MiB | print (“Running unpatched loads”) |
16 | 171.6 MiB | 2.4 MiB | loads(xmldata) |
17 | |||
18 | 171.6 MiB | 0.0 MiB | lxmlrpc.patch_xmlrpclib() |
19 | |||
20 | 171.6 MiB | 0.0 MiB | print (“Running patched loads”) |
21 | 171.8 MiB | 0.2 MiB | loads(xmldata) |