我该如何优化此代码?

时间:2010-03-19 21:36:02

标签: python mongodb

我正在为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()

3 个答案:

答案 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之后检查

在你告诉我到目前为止有多少次插入后,我会告诉你更多