Actuellement, j'analyse les logs Apache dans mes recherches. J'utilisais un module appelé apache-log-parser, mais je me suis soudainement demandé si j'avais besoin d'utiliser ce module et je l'ai cherché. Quelle est la plus rapide, la méthode utilisant l'expression régulière ou la méthode utilisant le module après analyse de l'adresse IP? ?? à propos de ça.
C'est un journal pour une journée (environ 45 Mo, 184087 lignes). Cette fois, seule l'adresse IP est affichée.
La première est la méthode d'expression régulière.
sample_regex.py
# coding:utf-8
#Un programme qui vérifie la recherche d'adresse IP la plus rapide à l'aide d'expressions régulières ou de modules
import time
import sys
import re
if __name__ == "__main__":
start = time.time()
argvs = sys.argv
f = open("~/apache_log_analysis/log_data/" + argvs[1])
re_ip_addr = re.compile("((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))")
for line in f.readlines():
try:
ip_addr = re_ip_addr.search(line)
if ip_addr.group() is not None:
print ip_addr.group()
except:
print "logfiled turned over"
f.close()
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time)) + "[sec]"
print "exit"
Le résultat était 2.10073304176 [sec]! Après l'avoir fait plusieurs fois, environ 0,9 [sec] semble être le plus rapide, et 0,9 [sec] a été mesuré dans la plupart des résultats d'exécution.
Vient ensuite la méthode utilisant des modules.
sample_module.py
# coding:utf-8
#Un programme qui vérifie la recherche d'adresse IP la plus rapide à l'aide d'expressions régulières ou de modules
import time
import sys
import apache_log_parser
if __name__ == "__main__":
start = time.time()
argvs = sys.argv
f = open("~/apache_log_analysis/log_data/" + argvs[1])
parser = apache_log_parser.make_parser('%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"')
for line in f.readlines():
try:
log_data = parser(line)
print log_data['remote_host']
except:
print "logfiled turned over"
f.close()
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time)) + "[sec]"
print "exit"
Le résultat était 78,4286789894 [sec]! J'ai vérifié plusieurs fois pour voir si j'avais fait une erreur dans le programme parce qu'il était trop tard, et je me suis demandé ce que c'était.
Si vous y réfléchissez, c'était un résultat naturel car diverses autres informations seraient analysées si vous utilisiez le module. Même ainsi, j'ai été surpris car il était trop tard. Quand j'ai regardé la source du module, il a été fait pour qu'il puisse être largement utilisé, donc c'était comme si c'était le cas.
À l'avenir, j'ai pensé qu'il valait mieux ne pas trop compter sur le module, mais le tirer de la source du module et n'utiliser que la partie nécessaire s'il est plus rapide de l'implémenter par vous-même.
J'ai appris que c'était pratique, mais on ne peut pas trop s'y fier. ..
Recommended Posts