精易论坛

标题: 代码运行效率极低,求助 [打印本页]

作者: Abe    时间: 2024-10-16 22:20
标题: 代码运行效率极低,求助
目的:处理游戏日志文本,提取出指定项目(时间、SteamID、昵称/编号、命令描述、命令文本)
日志文本示例:(仅展示了部分典型文本结构,还可能有其他文本结构,但是开头的日期是肯定有的,我在代码中已经做了处理,如正则匹配不到则只取时间和时间后面的文本)

2024.10.02-11.02.37: Game version: 0.9.543.81099
2024.10.02-11.04.40: '76561199125779714:精致生活服务员(1)' Command: 'listplayers true'
2024.10.02-11.04.51: '76561199125779714:精致生活服务员(1)' Command: 'ListSpawnedVehicles true'

2024.10.02-11.29.32: '76561198853518897:Dannmo(10)' Used map click teleport to player: '76561199770495755:3446924117(136)' Location: X=350994.000 Y=-517909.000 Z=8095.310
2024.10.14-14.20.21: Custom Zones updated by {小小 (9, 76561198397844696)}


存在问题的代码片段:

  
开始事务 (局_数据库句柄)
临时数值 = 到整数 (时间_到时间戳 (取现行时间 (), 假, ))
计次循环首 (取数组成员数 (局_文本数组), 局_计次3)
如果真 (到整数 (局_文本数组 [局_计次3]) ≠ 0 文本_寻找文本 (局_文本数组 [局_计次3], “: Game version: ”, , ) = -1)
' 调试输出 (局_文本数组 [局_计次3])
正则.创建 (“(\d{4}\.\d{2}\.\d{2}-\d{2}\.\d{2}\.\d{2}): '(\d{17}):([^']+)' ([^:]+): (.+)”, 局_文本数组 [局_计次3], , , , )
判断 (正则.取匹配数量 () ≠ 0)
局_原文时间 = 正则.取子匹配文本 (1, 1, )
局_转换后时间 = 日志时间转换 (局_原文时间)
局_SteamID = 正则.取子匹配文本 (1, 2, )
局_游戏名编号 = 正则.取子匹配文本 (1, 3, )
' 局_命令类型 = 读配置项 (取运行目录 () + “/日志关键字.ini”, “admin”, 正则.取子匹配文本 (1, 4, ), 正则.取子匹配文本 (1, 4, ))
局_原文 = 文本_替换 (正则.取子匹配文本 (1, 5, ), , , , “'”, “”, , , , , , , , )
局_译文 = admin_命令翻译 (正则.取子匹配文本 (1, 4, ), 局_原文)



正则.创建 (“(\d{4}\.\d{2}\.\d{2}-\d{2}\.\d{2}\.\d{2}): (.+)”, 局_文本数组 [局_计次3], , , , )
局_原文时间 = 正则.取子匹配文本 (1, 1, )
局_转换后时间 = 日志时间转换 (局_原文时间)
局_原文 = 文本_替换 (正则.取子匹配文本 (1, 2, ), , , , “'”, “”, , , , , , , , )
局_译文 = admin_命令翻译 (“其他”, 局_原文)

局_SQL语句 = “INSERT INTO log_admin_log (server_txt, file_name, log_time, real_time, SteamID, GameName_number, log_txt, real_txt, input_time) VALUES ('” + 局_目录数组 [局_计次]“','” + 局_文件数组 [局_计次1]“','” + 局_原文时间 + “','” + 局_转换后时间 + “','” + 局_SteamID + “','” + 局_游戏名编号 + “','” + 正则.取子匹配文本 (1, 4, )“:” + 局_原文 + “','” + 局_译文 + “',now())”
' 调试输出 (局_SQL语句)
如果真 (执行SQL语句 (局_数据库句柄, 局_SQL语句))
调试输出 (局_文本数组 [局_计次3])
调试输出 (“语句失败:” + 局_SQL语句)
跳出循环 ()


如果真 (局_计次3 = 取数组成员数 (局_文本数组))
调试输出 (保存事务 (局_数据库句柄))

计次循环尾 ()
调试输出 (“日志文件行数:”到文本 (取数组成员数 (局_文本数组)) + “,正则/语句耗时:”到文本 (到整数 (时间_到时间戳 (取现行时间 (), 假, )) - 临时数值)“毫秒”)


i支持库列表   支持库注释   
mysqlMySql支持库
spec特殊功能支持库


问题:单个日志文件有两千行左右,用上面的代码处理单个文件要耗时近1分钟,完全没有效率可言,希望有大佬帮忙优化代码或者提出新思路尽可能提升效率。


补充内容 (2024-10-17 10:45):
使用自带正则支持库也试过了,时间缩短到45秒左右,也还是太慢了,有几百个日志文件要处理

补充内容 (2024-10-17 11:35):
调试发现问题是由执行SQL导致的,经过优化,使用INSERT语句配合快速文本对象一次插入2000行数据,现在处理2059行数据缩减到2秒左右,还有优化空间吗
作者: Abe    时间: 2024-10-16 22:27


作者: Abe    时间: 2024-10-17 13:05

作者: welkin    时间: 2024-10-17 17:16
确实慢!




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4