|
|
Geplaatst op 02-06-2019 20:35:17
|
|
|
|

De FileReader API van HTML5 stelt de clientbrowser in staat om de lokale bestanden van de gebruiker te lezen, zodat het geüploade bestand niet langer door de server wordt gelezen, wat de last voor de server aanzienlijk vermindert en de tijd bespaart die nodig is om het bestand te uploaden. In de praktijk heb ik echter gemerkt dat ik een logbestand van 300k gemakkelijk kan verwerken met FileReader.readAsText(), maar als het logbestand zo groot is als 1G of zelfs 2G, crasht de browser. Dit komt doordat readAsText() het doelbestand in één keer in het geheugen laadt, waardoor het geheugen de limiet overschrijdt. Dus als de webapplicatie vaak grote bestanden moet verwerken, moeten we FileReader.readAsArrayBuffer() gebruiken om de bestanden stukje bij beetje te lezen.
Testscenario
Ons scenario is eenvoudig: JavaScript gebruiken om het tijdbereik van een IIS-log te verkrijgen
Voorbeeld IIS-logboeken:
#Software: Microsoft Internet Information Services 10.0 #Version: 1,0 #Date: 2016-08-18 06:53:55 #Fields: datum tijd s-ip cs-methode cs-uri-stem cs-uri-query s-port cs-gebruikersnaam 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 Ons doel is om het tijdsbestek van dat logboek te achterhalen:
Starttijd: 18-08-2016 06:53:55 Eindtijd: 2016-08-18 08:46:44
Gebruik readAsText()-implementatie
Het gebruik van readAsText() is relatief eenvoudig: nadat je de string van het hele bestand hebt gehaald, haal je de eerste 19 tekens van elke regel vanaf het begin, bepaal of het datumformaat wordt gehaald, als het wordt voldaan, dan zijn deze 19 tekens de starttijd, en hetzelfde gaat door elke regel vanaf de staart om de eindtijd te krijgen, de code is als volgt:
De lopende resultaten van het steekproef IIS-logboek (grootte: 1k) zijn zoals we verwachtten.
Maar zodra we kiezenEen groter IIS-log (grootte: 2G) en de browser crasht。 De reden is dat readAsText() het hele bestand eerst in het geheugen laadt, dus als het bestand te groot is, is er niet genoeg geheugen en crasht het browserproces.
Gebruik readAsArrayBuffer()-implementatie
Omdat het File-object in JavaScript van Blob erft, kunnen we de Blob.slice()-methode gebruiken om het bestand in kleine stukjes te knippen; het algemene idee is:
Neem eerst de eerste 10.000 inhoud van het bestand en zet deze om naar tekst Neem de eerste 19 tekens van elke regel vanaf het begin om te bepalen of het datumformaat wordt gehaald, en zo ja, dan zijn deze 19 tekens de starttijd Neem dan de 10.000 inhoud aan het einde van het bestand en zet die om in tekst Op dezelfde manier doorkruis je elke lijn vanuit de staartinhoud om de eindtijd te krijgen
De code is als volgt:
Met readAsArrayBuffer() konden we in zeer korte tijd de gewenste resultaten krijgen, zelfs met meer dan 2G IIS-logs.
|
Vorig:php roept de SMS-verificatiecode-interface aanVolgend:export, naamloze export en standaardexport
|