HTML5 FileReaderi API võimaldab kliendibrauseril lugeda kasutaja kohalikke faile, nii et üleslaaditud faili server enam ei loe, mis vähendab oluliselt serveri koormust ja säästab faili üleslaadimiseks kuluvat aega. Praktikas olen aga leidnud, et suudan hõlpsasti hallata 300k logifaili FileReader.readAsText() abil, kuid kui logifail on nii suur kui 1G või isegi 2G, jookseb brauser kokku. See on tingitud sellest, et readAsText() laadib sihtfaili korraga mällu, põhjustades mälu piiri ületamise. Kui veebirakendus peab sageli suuri faile töötlema, peaksime kasutama FileReader.readAsArrayBuffer() failide lugemiseks tükkhaaval.
Teststsenaarium
Meie stsenaarium on lihtne: JavaScripti abil saame IIS-logi ajavahemiku
Näidis-IIS logid:
#Software: Microsoft Internet Information Services 10.0 #Version: 1.0 #Date: 2016-08-18 06:53:55 #Fields: date time 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)+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 Meie eesmärk on saada selle logi ajaraam:
Algusaeg: 2016-08-18 06:53:55 Lõppaeg: 2016-08-18 08:46:44
Kasuta readAsText() rakendust
readAsText() kasutamine on suhteliselt lihtne: pärast kogu faili stringi saamist saad iga rea esimesed 19 tähemärki algusest, määra, kas kuupäeva formaat on täidetud, kui see on täidetud, siis need 19 märki on algusaeg ning sama kehtib iga saba rea kaudu, et saada lõppaeg, kood on järgmine:
Valimi IIS-i logi jooksutulemused (suurus: 1k) on sellised, nagu ootasime.
Aga kui me valimeSuurem IIS-logi (suurus: 2G) ja brauser jookseb kokku。 Põhjus on selles, et readAsText() laadib kõigepealt kogu faili mällu, nii et kui fail on liiga suur, jääb mälu liiga vähe ja brauseriprotsess jookseb kokku.
Kasuta readAsArrayBuffer() rakendust
Kuna JavaScriptis pärineb File objekt Blobilt, saame kasutada Blob.slice() meetodit, et lõigata fail väikesteks osadeks, üldine idee on:
Esiteks võta faili esimesed 10 000 sisu ja teisenda see tekstiks Võta iga rea esimesed 19 märki algusest, et määrata, kas kuupäeva formaat on täidetud, ja kui jah, siis need 19 tähemärki on algusaeg Seejärel võta faili lõpus olev 10 000 sisu ja teisenda see tekstiks Samamoodi, läbige iga joont saba sisust, et saada lõppaeg
Kood on järgmine:
readAsArrayBuffer() abil saime soovitud tulemused väga lühikese ajaga, isegi kui kasutasime rohkem kui 2G IIS logisid.
|