Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 32015|Yanıt: 3

[HTML/HTML5] Tarayıcıda büyük dosyaları işlemek için FileReader.readAsArrayBuffer() kullanın

[Bağlantıyı kopyala]
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
 Ev sahibi| Yayınlandı 2.06.2019 20:39:24 |
Yayınlandı 17.09.2021 09:11:00 |
Istemi:Yazarlar yasaklanır veya kaldırılır, içerik otomatik olarak engellenir
Yayınlandı 21.12.2021 18:26:43 |
Ev sahibinin yöntemlerinden öğrenin ve öğrenin
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com