HTML5 FileReader API ļauj klienta pārlūkprogrammai lasīt lietotāja lokālos failus, lai serveris vairs nelasītu augšupielādēto failu, kas ievērojami samazina servera slogu un ietaupa laiku, kas nepieciešams faila augšupielādei. Tomēr praksē es atklāju, ka es varu viegli apstrādāt 300k žurnālfailu ar FileReader.readAsText(), bet, ja žurnālfails ir tik liels kā 1G vai pat 2G, pārlūks avarēs. Tas ir tāpēc, ka readAsText() ielādēs mērķa failu atmiņā uzreiz, izraisot atmiņas ierobežojuma pārsniegšanu. Tātad, ja tīmekļa lietojumprogrammai bieži ir jāapstrādā lieli faili, mums jāizmanto FileReader.readAsArrayBuffer(), lai lasītu failus pa gabalam.
Testa scenārijs
Mūsu scenārijs ir vienkāršs, proti, izmantot JavaScript, lai iegūtu IIS žurnāla laika diapazonu
IIS žurnālu paraugi:
#Software: Microsoft interneta informācijas pakalpojumi 10.0 #Version: 1.0 #Date: 2016-08-18 06:53:55 #Fields: datums laiks s-ip cs-metode cs-uri-stem cs-uri-query s-port cs-lietotājvārds 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)+patīk+Gekons - 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)+patīk+Gekons - 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 Mūsu mērķis ir iegūt šī žurnāla laika grafiku:
Sākuma laiks: 2016-08-18 06:53:55 Beigu laiks: 2016-08-18 08:46:44
Izmantojiet readAsText() ieviešanu
ReadAsText() izmantošana ir salīdzinoši vienkārša, pēc visa faila virknes iegūšanas iegūstiet katras rindas pirmās 19 rakstzīmes no sākuma, nosakiet, vai datuma formāts ir izpildīts, ja tas ir apmierināts, tad šīs 19 rakstzīmes ir sākuma laiks, un tas pats iet cauri katrai rindai no astes, lai iegūtu beigu laiku, kods ir šāds:
IIS žurnāla parauga (izmērs: 1k) darbības rezultāti ir tādi, kādus mēs gaidījām.
Bet, kad mēs izvēlēsimiesLielāks IIS žurnāls (izmērs: 2G) un pārlūkprogramma avarē。 Iemesls ir tāds, ka readAsText() vispirms ielādēs visu failu atmiņā, tādēļ, ja fails ir pārāk liels, nebūs pietiekami daudz atmiņas un pārlūkprogrammas process avarēs.
Izmantojiet readAsArrayBuffer() ieviešanu
Tā kā JavaScript faila objekts manto no Blob, mēs varam izmantot Blob.slice() metodi, lai sagrieztu failu mazos gabaliņos, vispārējā ideja ir:
Vispirms paņemiet pirmos 10k faila saturu un konvertējiet to tekstā Paņemiet katras rindiņas pirmās 19 rakstzīmes no sākuma, lai noteiktu, vai datuma formāts ir izpildīts, un, ja tā, šīs 19 rakstzīmes ir sākuma laiks Pēc tam faila beigās paņemiet 10k saturu un pārveidojiet to tekstā Līdzīgi, šķērsojiet katru līniju no astes satura, lai iegūtu beigu laiku
Kods ir šāds:
Izmantojot readAsArrayBuffer(), mēs varējām iegūt vēlamos rezultātus ļoti īsā laikā, pat ar vairāk nekā 2G IIS žurnāliem.
|