HTML5 FileReader API leidžia kliento naršyklei nuskaityti vartotojo vietinius failus, kad serveris nebeskaitytų įkelto failo, o tai labai sumažina serverio naštą ir taupo laiką, reikalingą failui įkelti. Tačiau praktiškai pastebėjau, kad galiu lengvai tvarkyti 300k žurnalo failą su FileReader.readAsText(), bet kai žurnalo failas yra toks didelis kaip 1G ar net 2G, naršyklė sugenda. Taip yra todėl, kad readAsText() įkels tikslinį failą į atmintį iš karto, todėl atmintis viršys ribą. Taigi, jei žiniatinklio programai dažnai reikia apdoroti didelius failus, turėtume naudoti FileReader.readAsArrayBuffer(), kad perskaitytume failus po gabalėlį.
Bandymo scenarijus
Mūsų scenarijus yra paprastas, t. y. naudoti JavaScript, kad gautumėte IIS žurnalo laiko intervalą
IIS žurnalų pavyzdžiai:
#Software: Microsoft Internet Information Services 10.0 #Version: 1.0 #Date: 2016-08-18 06:53:55 #Fields: data laikas s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken 2016-08-18 06:53:55 ::1 GET / - 80 - ::1 Mozilla/5.0+(Windows+NT+10.0; +WOW64; +Trident / 7.0; +rv:11.0)+patinka+gekonas - 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)+patinka+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)+patinka+gekonas - 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)+patinka+gekonas - 200 0 0 6 Mūsų tikslas yra gauti šio žurnalo laikotarpį:
Pradžia: 2016-08-18 06:53:55 Pabaigos laikas: 2016-08-18 08:46:44
Naudoti readAsText() diegimą
Naudoti readAsText() yra gana paprasta, gavę viso failo eilutę, gaukite pirmuosius 19 kiekvienos eilutės simbolių nuo pradžios, nustatykite, ar laikomasi datos formato, jei jis patenkintas, tada šie 19 simbolių yra pradžios laikas, ir tas pats eina per kiekvieną eilutę nuo uodegos, kad gautumėte pabaigos laiką, kodas yra toks:
IIS žurnalo pavyzdžio (dydis: 1k) vykdomieji rezultatai yra tokie, kokių tikėjomės.
Bet kai mes pasirenkameDidesnis IIS žurnalas (dydis: 2G) ir naršyklė sugenda。 Priežastis ta, kad readAsText() pirmiausia įkels visą failą į atmintį, taigi, jei failas yra per didelis, neužteks atminties ir naršyklės procesas sugenda.
Naudoti readAsArrayBuffer() diegimą
Kadangi "JavaScript" failo objektas paveldi iš "Blob", galime naudoti "Blob.slice()" metodą, kad supjaustytume failą į mažus gabalėlius, bendra idėja yra tokia:
Pirmiausia paimkite pirmuosius 10 tūkstančių failo turinį ir konvertuokite jį į tekstą Paimkite pirmuosius 19 kiekvienos eilutės simbolių nuo pradžios, kad nustatytumėte, ar laikomasi datos formato, o jei taip, šie 19 simbolių yra pradžios laikas Tada paimkite 10k turinį failo pabaigoje ir konvertuokite jį į tekstą Panašiai pereikite kiekvieną liniją nuo uodegos turinio, kad gautumėte pabaigos laiką
Kodas yra toks:
Naudodami readAsArrayBuffer(), mes galėjome gauti norimus rezultatus per labai trumpą laiką, net ir su daugiau nei 2G IIS žurnalais.
|