我正在开发一个基于 Web 的日志管理系统,该系统将基于 Grails 框架构建,并且我将使用 Python 或 Perl 等文本处理语言之一。我创建了 Python 和 Perl 脚本来加载日志文件并解析每一行以将它们保存到 MySQL 数据库(该文件包含大约 40,000 行,大约 7MB)。使用 Perl需要1 分 2 秒,使用 Python 只需17 秒. 我原以为 Perl 会比 Python 快,因为 Perl 是最初的文本处理语言(我的怀疑也来自我正在阅读有关 Perl 文本处理性能的不同博客)。我也没想到 Perl 和 Python 之间会有 47 秒的差异。为什么 Perl 比 Python 需要更多时间来处理我的日志文件?是因为我使用了一些错误的 db 模块,还是我的 Perl 代码和正则表达式可以改进?
注意:我是一名 Java 和 Groovy 开发人员,我没有使用 Perl 的经验(我使用的是 Strawberry Perl v5.16)。我也用 Java(1 分 5 秒)和 Groovy(1 分 7 秒)进行了这个测试,但是处理日志文件的时间超过 1 分钟,所以这两种语言都已经过时了,现在我想在 Perl 和Python。
PERL 代码
use DBI;
use DBD::mysql;
# make connection to database
$connection = DBI->connect("dbi:mysql:logs:localhost:3306","root","") || die "Cannot connect: $DBI::errstr";
# set the value of your SQL query
$query = "insert into logs (line_number, dated, time_stamp, thread, level, logger, user, message)
values (?, ?, ?, ?, ?, ?, ?, ?) ";
# prepare your statement for connecting to the database
$statement = $connection->prepare($query);
$runningTime = time;
# open text file
open (LOG,'catalina2.txt') || die "Cannot read logfile!\n";;
while (<LOG>) {
my ($date, $time, $thread, $level, $logger, $user, $message) = /^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2},\d{3}) (\[.*\]) (.*) (\S*) (\(.*\)) - (.*)$/;
$statement->execute(1, $date, $time, $thread, $level, $logger, $user, $message);
}
# close the open text file
close(LOG);
# close database connection
$connection->disconnect;
$runningTime = time - $runningTime;
printf("\n\nTotal running time: %02d:%02d:%02d\n\n", int($runningTime / 3600), int(($runningTime % 3600) / 60), int($runningTime % 60));
# exit the script
exit;
Python代码
import re
import mysql.connector
import time
file = open("D:\catalina2.txt","r")
rexp = re.compile('^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2},\d{3}) (\[.*\]) (.*) (\S*) (\(.*\)) - (.*)$')
conn = mysql.connector.connect(user='root',host='localhost',database='logs')
cursor = conn.cursor()
tic = time.clock()
increment = 1
for text in file.readlines():
match = rexp.match(text)
increment += 1
cursor.execute('insert into logs (line_number,dated, time_stamp, thread,level,logger,user,message ) values (%s,%s,%s,%s,%s,%s,%s,%s)', (increment, match.group(1), match.group(2),match.group(3),match.group(4),match.group(5),match.group(6),match.group(7)))
conn.commit()
cursor.close()
conn.close()
toc = time.clock()
print "Total time: %s" % (toc - tic)