|
|
Yayınlandı 2.06.2019 20:35:17
|
|
|
|

HTML5'in FileReader API'si, istemci tarayıcının kullanıcının yerel dosyalarını okumasına olanak tanır; böylece yüklenen dosya sunucu tarafından okunmaz; bu da sunucunun yükünü büyük ölçüde azaltır ve dosyayı yüklemek için gereken zamanı azaltır. Ancak pratikte, FileReader.readAsText() ile 300k günlük dosyayı kolayca yönetebileceğimi fark ettim, ancak log dosyası 1G veya hatta 2G kadar büyükse tarayıcı çöküyor. Bunun nedeni, readAsText() hedef dosyayı bir anda belleğe yükleyip belleğin sınırı aşmasına neden olur. Yani web uygulaması genellikle büyük dosyaları işlemesi gerekiyorsa, dosyaları parça parça okumak için FileReader.readAsArrayBuffer() kullanmalıyız.
Test senaryosu
Senaryomuz basit; yani bir IIS günlüğünün zaman aralığını almak için JavaScript kullanmak
Örnek IIS günlükleri:
#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 Amacımız, o günlüğün zaman dilimini almaktır:
Başlangıç saati: 2016-08-18 06:53:55 Bitiş saati: 2016-08-18 08:46:44
readAsText() uygulamasını kullanın
readAsText() kullanımı nispeten basittir, tüm dosyanın dizisini aldıktan sonra, her satırın ilk 19 karakterini baştan alın, tarih formatının karşılanıp sağlanmadığını belirleyin, eğer sağlanırsa, bu 19 karakter başlangıç zamanıdır ve aynı şekilde kuyruk satırından her satırdan geçerek bitiş zamanını elde edersiniz, kod şöyledir:
Örnek IIS günlüğünün (büyüklüğü: 1k) çalışma sonuçları beklediğimiz gibidir.
Ama bir kez seçtiğimizdeDaha büyük bir IIS logu (boyut: 2G) ve tarayıcı çöker。 Sebebi, readAsText() önce tüm dosyayı belleğe yükler, bu yüzden dosya çok büyükse yeterli bellek kalmaz ve tarayıcı işlemi çöker.
readAsArrayBuffer() uygulamasını kullanın
JavaScript'teki File nesnesi Blob'tan miras alındığından, dosyayı küçük parçalara bölmek için Blob.slice() yöntemini kullanabiliriz, genel fikir şudur:
Öncelikle, dosyanın ilk 10 bin içeriğini alın ve metne dönüştürün Tarih formatının uydurulup uymadığını belirlemek için her satırın ilk 19 karakterini alın, eğer uygunsa, bu 19 karakter başlangıç saati olarak belirlenir Sonra dosyanın sonundaki 10k içeriği alıp metne dönüştürüyorsun Benzer şekilde, kuyruk içeriğinden her satırı dolaşarak bitiş zamanını elde edin
Kod şöyledir:
readAsArrayBuffer() kullanarak, 2G'den fazla IIS logu olmasına rağmen istediğimiz sonuçları çok kısa sürede alabildik.
|
Önceki:php, SMS doğrulama kodu arayüzünü çağırırÖnümüzdeki:İhracat adlanan ihracat ve varsayılan ihracat
|