Je suis en train d'écrire un script qui analyse de gros fichiers (apache) de 400 Mo dans une table pandas.Comment accélérer l'analyse du journal Apache avec RegEx pour étendre la base de données Pandas?
Mon ancien ordinateur portable analyse le fichier journal apache avec le script en environ 2 minutes. Maintenant je me demande si ça ne pourrait pas être plus rapide?
La structure du fichier journal apache est comme ceci: Ip - - [timestamp] « GET ... méthode » http le code d'état octets « adresse » « useragent » Par exemple:
93.185.11.11 - - [13/Aug/2016:05:34:12 +0200] "GET /v1/con?from=…" 200 575 "http://google.com" "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0"
Mon code utilise regex findall. J'ai aussi testé avec le match et la méthode de recherche. Mais ils semblent être plus lents.
reg_dic = {
"ip" : r'\b(?:(?: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]?)\b',
"timestamp" : r'\[\d+\/\w+\/\d+\:\d+\:\d+\:\d+\s\+\d+\]',
"method" : r'"(.*?)"',
"httpstatus" : r'\s\d{1,3}\s',
"bytes_" : r'\s\d+\s\"',
"adress" : r'\d\s\"(.*?)"',
"useragent" : r'\"\s\"(.*?)"'
}
for name, reg in reg_dic.items() :
item_list = []
with open (file) as f_obj:
for line in f_obj :
item = re.findall(reg , line)
item = item[0]
if name == "bytes_" :
item = item.replace("\"", "")
item = item.strip()
item_list.append(item)
df[ name ] = item_list
del item_list
Voir [cette démo Python] (https://ideone.com/LLW3Uf) et le (https [demo regex]: // regex101 .com/r/UOtsAL/1). Si vos lignes de journal ont toujours le même format, cela devrait être assez rapide et sûr. –