Το FileReader API της HTML5 επιτρέπει στο πρόγραμμα περιήγησης πελάτη να διαβάζει τα τοπικά αρχεία του χρήστη, έτσι ώστε το μεταφορτωμένο αρχείο να μην διαβάζεται πλέον από τον διακομιστή, γεγονός που μειώνει σημαντικά την επιβάρυνση του διακομιστή και εξοικονομεί τον χρόνο που απαιτείται για τη μεταφόρτωση του αρχείου. Ωστόσο, στην πράξη, διαπίστωσα ότι μπορώ εύκολα να χειριστώ ένα αρχείο καταγραφής 300k με το FileReader.readAsText(), αλλά όταν το αρχείο καταγραφής είναι τόσο μεγάλο όσο 1G ή ακόμα και 2G, το πρόγραμμα περιήγησης θα διακοπεί. Αυτό συμβαίνει επειδή η readAsText() θα φορτώσει το αρχείο προορισμού στη μνήμη ταυτόχρονα, με αποτέλεσμα η μνήμη να υπερβεί το όριο. Επομένως, εάν η εφαρμογή Ιστού χρειάζεται συχνά να επεξεργάζεται μεγάλα αρχεία, θα πρέπει να χρησιμοποιήσουμε το FileReader.readAsArrayBuffer() για να διαβάσουμε τα αρχεία κομμάτι-κομμάτι.
Σενάριο δοκιμής
Το σενάριό μας είναι απλό, το οποίο είναι να χρησιμοποιήσουμε JavaScript για να λάβουμε το χρονικό εύρος ενός αρχείου καταγραφής IIS
Δείγματα αρχείων καταγραφής IIS:
#Software: Υπηρεσίες Microsoft Internet Information Services 10.0 #Version: 1.0 #Date: 2016-08-18 06:53:55 #Fields: ημερομηνία ώρα 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; +ΟΥΑΟΥ64; +Τρίαινα/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; +ΟΥΑΟΥ64; +Τρίαινα/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; +Νίκη64; +x64; +Τρίαινα/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; +Νίκη64; +x64; +Τρίαινα/7.0; +rv:11.0)+like+Gecko - 200 0 0 6 Στόχος μας είναι να λάβουμε το χρονικό πλαίσιο αυτού του αρχείου καταγραφής:
Ώρα έναρξης: 2016-08-18 06:53:55 Ώρα λήξης: 2016-08-18 08:46:44
Χρησιμοποιήστε την υλοποίηση readAsText().
Η χρήση του readAsText() είναι σχετικά απλή, αφού λάβετε τη συμβολοσειρά ολόκληρου του αρχείου, λάβετε τους πρώτους 19 χαρακτήρες κάθε γραμμής από την αρχή, προσδιορίστε εάν πληρούται η μορφή ημερομηνίας, εάν ικανοποιείται, τότε αυτοί οι 19 χαρακτήρες είναι η ώρα έναρξης και το ίδιο περνάει από κάθε γραμμή από την ουρά για να λάβετε την ώρα λήξης, ο κωδικός έχει ως εξής:
Τα τρέχοντα αποτελέσματα του δείγματος αρχείου καταγραφής IIS (μέγεθος: 1k) είναι όπως τα περιμέναμε.
Αλλά μόλις επιλέξουμεΈνα μεγαλύτερο αρχείο καταγραφής IIS (μέγεθος: 2G) και το πρόγραμμα περιήγησης διακόπτεται。 Ο λόγος είναι ότι το readAsText() θα φορτώσει πρώτα ολόκληρο το αρχείο στη μνήμη, οπότε αν το αρχείο είναι πολύ μεγάλο, δεν θα υπάρχει αρκετή μνήμη και η διαδικασία του προγράμματος περιήγησης θα διακοπεί.
Χρήση της υλοποίησης readAsArrayBuffer()
Δεδομένου ότι το αντικείμενο File στο JavaScript κληρονομεί από το Blob, μπορούμε να χρησιμοποιήσουμε τη μέθοδο Blob.slice() για να κόψουμε το αρχείο σε μικρά κομμάτια, η γενική ιδέα είναι:
Αρχικά, πάρτε τα πρώτα 10k περιεχόμενα του αρχείου και μετατρέψτε το σε κείμενο Πάρτε τους πρώτους 19 χαρακτήρες κάθε γραμμής από την αρχή για να προσδιορίσετε εάν πληρούται η μορφή ημερομηνίας και, εάν ναι, αυτοί οι 19 χαρακτήρες είναι η ώρα έναρξης Στη συνέχεια, πάρτε το περιεχόμενο 10k στο τέλος του αρχείου και μετατρέψτε το σε κείμενο Ομοίως, διασχίστε κάθε γραμμή από το περιεχόμενο της ουράς για να λάβετε την ώρα λήξης
Ο κωδικός έχει ως εξής:
Χρησιμοποιώντας το readAsArrayBuffer(), μπορέσαμε να λάβουμε τα αποτελέσματα που θέλαμε σε πολύ σύντομο χρονικό διάστημα, ακόμη και με περισσότερα από 2G αρχεία καταγραφής IIS.
|