我是新到这个网站在张贴,我发现了很多答案在这里。你知道吗
我不是最好的python或mysql程序员,但我想创建一个非常简单的脚本, 把一些信息放在数据库里,我可以在那里查找和排序。你知道吗
我正在尝试创建类似DNS请求记录器的东西。 Windows 2003(当前)服务器正在将所有DNS请求记录到文件中。 每天我把这个(新的)日志文件拉到Ubuntu机器上,把它处理成MySQL数据库, 使用sh和python。你知道吗
这里是我想要一些建议的地方,日志文件可能会变大,大约70k行, 使用下面的代码,这可能需要20分钟的处理。有没有什么方法可以加快它的速度(我是不是用了糟糕的编码)或者它是“正常”的。你知道吗
我试着让我的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 | |
+---------------------+--------------+------+-----+---------+----------------+
我编辑了代码并提出了一些建议, 此时,处理时间缩短为3分钟 小文件和10分钟的大文件。你知道吗
不是最好的速度,但比以前更好 (特别是因为时间随着较大的DB而增加,如图1所示)
新脚本:
行计数:
SQL表:
对于那些对执行时间感兴趣的人:
数据库操作总是需要时间的,最好的方法是在windows上保存一个复制DNS请求文件,您可以从中继续处理。你知道吗
但是,每5-10分钟就向后端的ubuntu系统发送一个提交请求。你知道吗
如果我误解了这个问题,请告诉我。你知道吗
相关问题 更多 >
编程相关推荐