我正在为squid开发一个logger守护进程来获取mongodb数据库上的日志。但我遇到了太多的CPU使用率。如何优化此代码?
from sys import stdin
from pymongo import Connection
connection = Connection()
db = connection.squid
logs = db.logs
buffer = []
a = 'timestamp'
b = 'resp_time'
c = 'src_ip'
d = 'cache_status'
e = 'reply_size'
f = 'req_method'
g = 'req_url'
h = 'username'
i = 'dst_ip'
j = 'mime_type'
L = 'L'
while True:
l = stdin.readline()
if l[0] == L:
l = l[1:].split()
buffer.append({
a: float(l[0]),
b: int(l[1]),
c: l[2],
d: l[3],
e: int(l[4]),
f: l[5],
g: l[6],
h: l[7],
i: l[8],
j: l[9]
}
)
if len(buffer) == 1000:
logs.insert(buffer)
buffer = []
if not l:
break
connection.disconnect()
答案 0 :(得分:1)
对于python探查器来说,这可能是一个更好的问题。有一些内置的Python分析模块,如cProfile;你可以阅读更多相关信息here。
答案 1 :(得分:0)
我怀疑它实际上可能是readline()导致cpu利用率。尝试运行相同的代码,只需查看由您提供的一些常量缓冲区替换readline。并尝试使用注释掉的数据库插件运行。确定其中哪一个是罪魁祸首。
答案 2 :(得分:0)
cpu用法由该活动循环While True给出。 你有多少行/分钟?把
if len(buffer) == 1000:
logs.insert(buffer)
buffer = []
在buffer.append之后检查
在你告诉我到目前为止有多少次插入后,我会告诉你更多