A HTML5 FileReader API-ja lehetővé teszi a kliens böngésző számára, hogy olvassa a felhasználó helyi fájljait, így a feltöltött fájlt már nem olvassa el a szerver, ami jelentősen csökkenti a szerver terhét és megtakarítja a fájl feltöltéséhez szükséges időt. A gyakorlatban azonban azt tapasztaltam, hogy könnyen kezelni tudok egy 300k naplófájlt a FileReader.readAsText() segítségével, de ha a naplófájl 1G vagy akár 2G méretű, a böngésző összeomlik. Ez azért van, mert a readAsText() egyszerre tölti be a célfájlt a memóriába, így a memória túllépi a határt. Tehát ha a webalkalmazásnak gyakran nagy fájlokat kell feldolgoznia, akkor a FileReader.readAsArrayBuffer() segítségével olvassuk el a fájlokat darabonként.
Teszt forgatókönyv
A mi helyzetünk egyszerű: JavaScript segítségével megkapjuk az IIS napló időtartományát
Példa IIS naplók:
#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 Célunk, hogy megtudjuk ennek a naplónak az időkeretét:
Kezdési idő: 2016-08-18 06:53:55 Végidő: 2016-08-18 08:46:44
readAsText() implementáció használata
A readAsText() használata viszonylag egyszerű: miután megkaptuk a teljes fájl stringjét, megkapjuk minden sorból az első 19 karaktert az elejétől, határozd meg, hogy a dátumformátum teljes-e, ha teljesül, akkor ez a 19 karakter a kezdeti idő, és ugyanez megy végig minden soron a végidőhöz, a kód a következő:
A mintavételi IIS napló (méret: 1k) futó eredményei a vártoknak megfelelően teljesítenek.
De ha egyszer választjukEgy nagyobb IIS napló (méret: 2G) és a böngésző összeomlik。 Ennek oka, hogy a readAsText() először az egész fájlt tölti be a memóriába, így ha a fájl túl nagy, akkor nem lesz elég memória, és a böngészőfolyamat összeomlik.
Használd readAsArrayBuffer() implementációt
Mivel a JavaScript File objektuma a Blobból örököl, a Blob.slice() módszerrel apró darabokra vághatjuk a fájlt, az általános ötlet a következő:
Először vegyük a fájl első 10 ezer tartalmát, és konvertáld szöveggé Vegyük az elején minden sorból az első 19 karaktert, hogy megállapítsuk, teljesül-e a dátumformátum, és ha igen, akkor ez a 19 karakter a kezdő időpont Ezután a fájl végén lévő 10k tartalmat szöveggé alakítsd át Hasonlóképpen, végighaladjunk a faroktartalom minden vonalán, hogy megkapd a végidőt
A kódex a következő:
A readAsArrayBuffer() segítségével nagyon rövid idő alatt elértük a kívánt eredményeket, még több mint 2G IIS naplókkal is.
|