Как я могу оптимизировать этот код? - PullRequest
0 голосов
/ 20 марта 2010

Я занимаюсь разработкой демона logger для squid для захвата логов в базе данных mongodb Но я испытываю слишком много использования процессора. Как я могу оптимизировать этот код?


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 ]

1 голос
/ 20 марта 2010

Это может быть лучшим вопросом для профилировщика Python. Есть несколько встроенных модулей профилирования Python, таких как cProfile; Вы можете прочитать больше об этом здесь .

0 голосов
/ 20 марта 2010

Использование процессора задается этим активным циклом, пока True. Сколько строк / минут у вас есть? поставить

if len(buffer) == 1000:    
    logs.insert(buffer)
    buffer = []

проверка после буфера.append

Я скажу вам больше после того, как вы скажете мне, сколько вложений вы уже получили

0 голосов
/ 20 марта 2010

Я подозреваю, что это может быть readline (), вызывающее использование процессора. Попробуйте запустить тот же код с заменой readline, просто глядя на некоторый постоянный буфер, предоставленный вами. И попробуйте запустить с закомментированными вставками базы данных. Установите, кто из них является виновником.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...