HTML5:n FileReader-rajapinta mahdollistaa asiakasselaimen lukea käyttäjän paikallisia tiedostoja, jolloin ladattua tiedostoa ei enää lue palvelin, mikä vähentää merkittävästi palvelimen kuormitusta ja säästää tiedoston lataamiseen kuluvaa aikaa. Käytännössä huomasin, että pystyn helposti käsittelemään 300k lokitiedostoa FileReader.readAsText(), mutta kun lokitiedosto on niin suuri kuin 1G tai jopa 2G, selain kaatuu. Tämä johtuu siitä, että readAsText() lataa kohdetiedoston muistiin kerralla, jolloin muisti ylittää rajan. Jos web-sovellus usein tarvitsee käsitellä suuria tiedostoja, meidän tulisi käyttää FileReader.readAsArrayBuffer() -ohjelmaa tiedostojen lukemiseen pala palalta.
Testitilanne
Meidän skenaario on yksinkertainen: JavaScriptillä saadaan IIS-lokin aikaväli
Esimerkki IIS:n lokitiedostoista:
#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 Tavoitteemme on saada aikakehys kyseiselle lokipäiväkirjalle:
Aloitusaika: 2016-08-18 06:53:55 Loppuaika: 2016-08-18 08:46:44
Käytä readAsText()-toteutusta
readAsText():n käyttö on suhteellisen yksinkertaista: saatuaan koko tiedoston merkkijonon, saat ensimmäiset 19 merkkiä jokaiselta riviltä alusta, määrität täyttyykö päivämäärämuoto, jos se täyttyy, nämä 19 merkkiä ovat aloitusaika, ja sama käy jokaisen rivin läpi hännästä saadakseen loppuajan, koodi on seuraava:
Otoksen IIS-lokikirjan juoksevat tulokset (koko: 1k) ovat odotetut.
Mutta kun kerran valitsemmeSuurempi IIS-loki (koko: 2G) ja selain kaatuu。 Syynä on se, että readAsText() lataa ensin koko tiedoston muistiin, joten jos tiedosto on liian suuri, muistia ei ole tarpeeksi ja selainprosessi kaatuu.
Käytä readAsArrayBuffer()-toteutusta
Koska JavaScriptin File-objekti perii Blobilta, voimme käyttää Blob.slice()-menetelmää pilkkomaan tiedoston pieniksi paloiksi, yleinen idea on:
Ensiksi ota tiedoston ensimmäiset 10 000 sisältöä ja muunna se tekstiksi Ota jokaisen rivin ensimmäiset 19 merkkiä alusta selvittääksesi, täyttyykö päivämäärämuoto, ja jos on, nämä 19 merkkiä ovat aloitusaika Sitten ota tiedoston lopussa oleva 10 000 sisältö ja muunnetaan se tekstiksi Samoin kulje jokainen viiva hännän sisällöstä saadaksesi loppuajan
Koodi on seuraava:
readAsArrayBuffer() avulla saimme haluamamme tulokset hyvin lyhyessä ajassa, vaikka meillä oli yli 2G IIS -lokitietoja.
|