gpt4 book ai didi

Python MySQL 脚本速度慢,需要一些建议

转载 作者:行者123 更新时间:2023-11-29 23:20:17 25 4
gpt4 key购买 nike

我是这个网站发帖的新手,我在这里找到了很多答案。

我不是最好的 python 或 mysql 程序员,但我想创建一个非常简单的脚本,它将一些信息放入数据库中,我可以在其中查找和排序,等等。

我正在尝试创建类似 DNS 请求记录器的东西。Windows 2003(当前)服务器正在将所有 DNS 请求记录到文件中。每天我都会将该(新的)日志文件拉到 Ubuntu 机器上,将其处理成 MySQL 数据库,使用 sh 和 python。

这是我想要一些建议的部分,日志文件可能会变得很大,大约 70k 行,使用下面的代码,处理过程可能会轻松花费 20 分钟。有没有什么方法可以加快速度(我是否使用了糟糕的编码)或者它是“OK”吗?

我尝试让我的 sql 命令尽可能具体,不返回任何需要的内容,每 5000 次迭代才使用一次提交

主要概要:检查数据库中是否存在记录,如果不存在,则返回ID。检查该时间是否已经有记录的条目(HH:MM,注意到几乎在同一时间有多个查询),如果没有创建条目,则计数加 1。

就是这样..

提前感谢谁愿意看一下。

尼克。

示例条目:

20141204 23:00:50 172.000.000.000 A .www.google.nl
20141204 23:00:53 172.000.000.000 AAAA .www.google.nl

代码:

#! /usr/bin/python

import os, sys
from datetime import datetime
import MySQLdb

# variables
dnslog = "dns-edited.log"
sqldb = None
sqlcur = None

def leesBestand(bestand):
with open(bestand,"r") as entries:
runcount = 0
for entry in entries:
# 0:<Datum> 1:<Tijd> 2:<IP Requester> 3:<Record Type> 4:<Domain name>
words = entry.split()

datum = setDatum(words[0])
tijd = setTijd(words[1])

domainId = checkEntry(words[4][1:],words[3])
requestId = bestaadRequest(datum,tijd,words[2],domainId)

if runcount > 5000 :
dbCommit()
runcount = 0
runcount += 1

def dbExecute(sqlstring):
try :
global sqlcur
sqlcur.execute(sqlstring)
except MySQLdb.Error,e:
global sqldb
sqldb.rollback()
print "[Error-Execute] : " + str(e)

def dbCommit():
global sqldb
try :
print "[Debug] SQL Commit"
sqldb.commit()
except MySQLdb.Error,e:
sqldb.rollback()
print "[Error-Commit] : " + str(e)

def checkEntry(domain,domaintype):
global sqlcur
sqlstring = """SELECT dnslog_domain_id FROM dnslog_domains WHERE `dnslog_domain_name` = '%s' AND
`dnslog_domain_type` = '%s'""" % (domain,domaintype)
dbExecute(sqlstring)

row = sqlcur.fetchone()
if row :
return row[0]
else :
sqlvalues = prepareInsertDomain(domain,domaintype)
sqlinsert = """INSERT INTO dnslog_domains VALUES ('','%s','%s','%s','%s','%s','%s','%s','%s')
""" % (sqlvalues[0],sqlvalues[1],sqlvalues[2],sqlvalues[3],sqlvalues[4],sqlvalues[5],sqlvalues[6],sqlvalues[7])
dbExecute(sqlinsert)
return sqlcur.lastrowid

def bestaadRequest(datum,tijd,requester,domainId):
global sqlcur
sqlstring = """SELECT dnslog_request_id, dnslog_request_count FROM dnslog_requests WHERE `dnslog_domain_id` = '%s' AND
`dnslog_request_requester` = '%s' AND `dnslog_request_date` = '%s' AND `dnslog_request_time` = '%s'
""" % (domainId,requester,datum,tijd)
dbExecute(sqlstring)

row = sqlcur.fetchone()
if row :
teller = int(row[1]) + 1
sqlinsert = """UPDATE `dnslog_requests` SET `dnslog_request_count` = '%s' WHERE `dnslog_request_id` = '%s' """ % (teller, row[0])
dbExecute(sqlinsert)
return row[0]
else :
sqlinsert = """INSERT INTO dnslog_requests VALUES ('','%s','%s','%s','%s','%s') """ % (domainId,requester,datum,tijd,"1")
dbExecute(sqlinsert)
return sqlcur.lastrowid

# Main starting function
if __name__ == '__main__':
dbConnect()

leesBestand(dnslog)

dbCommit()

dbClose()

数据库布局

mysql> describe dnslog_requests;
+--------------------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+-------------+------+-----+---------+----------------+
| dnslog_request_id | int(11) | NO | PRI | NULL | auto_increment |
| dnslog_domain_id | int(11) | YES | | NULL | |
| dnslog_request_requester | varchar(15) | NO | | NULL | |
| dnslog_request_date | date | NO | | NULL | |
| dnslog_request_time | time | NO | | NULL | |
| dnslog_request_count | int(11) | NO | | NULL | |
+--------------------------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql> describe dnslog_domains;
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| dnslog_domain_id | int(11) | NO | PRI | NULL | auto_increment |
| dnslog_domain_name | varchar(250) | NO | | NULL | |
| dnslog_domain_type | varchar(15) | NO | | NULL | |
| dnslog_domain_part1 | varchar(100) | NO | | NULL | |
| dnslog_domain_part2 | varchar(100) | NO | | NULL | |
| dnslog_domain_part3 | varchar(100) | NO | | NULL | |
| dnslog_domain_part4 | varchar(100) | NO | | NULL | |
| dnslog_domain_part5 | varchar(100) | NO | | NULL | |
| dnslog_domain_part6 | varchar(100) | NO | | NULL | |
+---------------------+--------------+------+-----+---------+----------------+

最佳答案

数据库操作总是需要时间,最好的方法是在 Windows 上保留一个 DNS 请求文件副本,以便您可以继续处理。

但是,每 5-10 分钟向后端的 ubuntu 系统发送一次提交请求。

如果我误解了这个问题,请告诉我。

关于Python MySQL 脚本速度慢,需要一些建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27378835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com