回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我是新到这个网站在张贴,我发现了很多答案在这里。你知道吗</p>
<p>我不是最好的python或mysql程序员,但我想创建一个非常简单的脚本,
把一些信息放在数据库里,我可以在那里查找和排序。你知道吗</p>
<p>我正在尝试创建类似DNS请求记录器的东西。
Windows 2003(当前)服务器正在将所有DNS请求记录到文件中。
每天我把这个(新的)日志文件拉到Ubuntu机器上,把它处理成MySQL数据库,
使用sh和python。你知道吗</p>
<p>这里是我想要一些建议的地方,日志文件可能会变大,大约70k行,
使用下面的代码,这可能需要20分钟的处理。有没有什么方法可以加快它的速度(我是不是用了糟糕的编码)或者它是“正常”的。你知道吗</p>
<p>我试着让我的sql命令尽可能具体,只返回所需的命令,
每5000次迭代只使用一次提交</p>
<p>主要轮廓:
检查数据库中是否存在记录,如果不存在,则返回ID。
检查当时是否已经有一个记录的条目(HH:MM,注意到几乎同时有多个查询),如果没有创建条目,否则加1计数。你知道吗</p>
<p>就这样。。你知道吗</p>
<p>提前谢谢愿意看的人。你知道吗</p>
<p>尼克。你知道吗</p>
<p>示例条目:</p>
<pre><code>20141204 23:00:50 172.000.000.000 A .www.google.nl
20141204 23:00:53 172.000.000.000 AAAA .www.google.nl
</code></pre>
<p>代码:</p>
<pre><code>#! /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()
</code></pre>
<p>数据库布局</p>
<pre><code>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 | |
+---------------------+--------------+------+-----+---------+----------------+
</code></pre>