HTML5-jev FileReader API omogoča brskalniku odjemalca branje lokalnih datotek uporabnika, tako da naložene datoteke strežnik ne bere več, kar močno zmanjša obremenitev strežnika in prihrani čas, potreben za nalaganje datoteke. V praksi pa sem ugotovil, da lahko z FileReader.readAsText() enostavno obdelam 300k dnevnik datoteko, vendar ko je dnevnik tako velik kot 1G ali celo 2G, brskalnik zruši. To je zato, ker readAsText() naloži ciljno datoteko v pomnilnik naenkrat, kar povzroči, da pomnilnik preseže omejitev. Če spletna aplikacija pogosto potrebuje obdelavo velikih datotek, bi morali uporabiti FileReader.readAsArrayBuffer() za branje datotek kos za kosom.
Testni scenarij
Naš scenarij je preprost, in sicer, da uporabimo JavaScript za pridobitev časovnega obdobja IIS dnevnika
Primeri IIS dnevnikov:
#Software: Microsoft Internet Information Services 10.0 #Version: 1,0 #Date: 2016-08-18 06:53:55 #Fields: datum čas s-ip cs-metoda cs-uri-stem cs-uri-poizvedba s-port cs-uporabniško ime c-ip cs(User-agent) cs(Referer) sc-status sc-podstatus sc-win32-status časovno vzeto 2016-08-18 06:53:55 ::1 GET / - 80 - ::1 Mozilla/5.0+(Windows+NT+10.0; +WOW64; +Trident/7,0; +rv:11.0)+like+Gecko - 200 0 0 476 2016-08-18 06:53:55 ::1 GET /iisstart.png - 80 - ::1 Mozilla/5.0+(Windows+NT+10.0; +WOW64; +Trident/7,0; +rv:11.0)+like+Gecko http://localhost/ 200 0 0 3 2016-08-18 08:45:34 10.172.19.198 GET /test/pac/wpad.dat - 80 - 10.157.21.235 Mozilla/5.0+(Windows+NT+6.1; +Win64; +x64; +Trident/7,0; +rv:11.0)+like+Gecko - 404 3 50 265 2016-08-18 08:46:44 10.172.19.198 GET /test/pac/wpad.dat - 80 - 10.157.21.235 Mozilla/5.0+ (Windows+NT+6.1; +Win64; +x64; +Trident/7,0; +rv:11.0)+like+Gecko - 200 0 0 6 Naš cilj je dobiti časovni okvir tega dnevnika:
Začetek: 2016-08-18 06:53:55 Končni čas: 2016-08-18 08:46:44
Uporabite implementacijo readAsText()
Uporaba readAsText() je razmeroma preprosta: po pridobitvi niza celotne datoteke dobimo prvih 19 znakov vsake vrstice na začetku, določimo, ali je datum formata izpolnjen, če je izpolnjen, teh 19 znakov predstavlja začetni čas, enako pa poteka skozi vsako vrstico od konca za končni čas, koda je naslednja:
Rezultati vzorčnega IIS dnevnika (velikost: 1k) so taki, kot smo pričakovali.
A ko enkrat izberemoVečji IIS dnevnik (velikost: 2G) in brskalnik se sesuje。 Razlog je v tem, da readAsText() najprej naloži celotno datoteko v pomnilnik, tako da če je datoteka prevelika, ne bo dovolj pomnilnika in proces brskalnika se bo sesul.
Uporabite implementacijo readAsArrayBuffer()
Ker objekt File v JavaScriptu podeduje od Blob, lahko uporabimo metodo Blob.slice() za rezanje datoteke na majhne dele, je splošna ideja:
Najprej vzemi prvih 10.000 vsebin datoteke in jo pretvori v besedilo Vzemite prvih 19 znakov vsake vrstice od začetka, da ugotovite, ali je datumska oblika izpolnjena, in če je, teh 19 znakov predstavlja začetni čas Nato vzamem 10k vsebine na koncu datoteke in jo pretvorim v besedilo Podobno prečkajte vsako vrstico od vsebine repa, da dobite končni čas
Koda je naslednja:
Z uporabo readAsArrayBuffer() smo v zelo kratkem času dosegli želene rezultate, tudi z več kot 2G IIS logi.
|