2010-05-21 25 views
7

Bir döngüde yerel dosya sisteminden çok fazla (yüzlerce bin) görece küçük dosya (birkaç KB) okuyan bir kod parçam var. Her dosya için içeriği okumak için oluşturulan bir java.io.FileInputStream var. Süreç çok yavaş ve yaşlanır.FileInputStream'i arabelleğe alma hakkında ne düşünüyorsunuz?

FIS'i java.io.BufferedInputStream içine yerleştirmenin önemli bir fark yaratacağını düşünüyor musunuz?

+4

Neden farkı kendiniz ölçmeye çalışmayın? Bu, ortamınızda nasıl çalıştığını bilmenin tek yolu, JVM'niz vb. –

+1

Bu durumu çevremde ölçtüm. FIS'i BIS'e koyarken büyük bir gelişme yoktur. –

cevap

9

zaten okuma/yazma döngüsü (BufferedInputStream son uygulama 8KB kullanır) iyi bir boyutta bir byte[] buffer kullanmıyorsanız, o zaman olacak kesinlikle yapmak farkı. Kendin dene. Ayrıca OutputStreamBufferedOutputStream'u da eklemeyi unutmayın.

Ancak, byte[] kullanarak arabelleğe aldırdıysanız ve/veya her şeyden sonra sadece küçük bir fark yaratırsanız, o zaman dar boğaz ve I/O denetleyici hızını darboğaz olarak vurdunuz.

3

Bunun herhangi bir fark yaratacağından şüphe duyuyorum.

Temel sorun, minik dosyaların yüzlerce throusand'larıdır. Bunları okumak diski thrash yapacak ve sonsuza dek sürecek, nasıl yapıyor olursanız olun, sabit disk içinde mekanik hareketin beklediği sürenin% 99,9'unu geçireceksiniz.

Bunu düzeltmek için iki yol vardır: Bir SSD verilerinizin kaydet

  • - gecikmeyi (büyüklük az beş siparişlerde gibi) çok daha düşük olması.
  • birkaç büyük dosyalar halinde verilerinizi yeniden düzenleyin ve verileri okuyorsanız bağlıdır olanlar sırayla
3

okuyun. FileInputStream öğesinden çok verimsiz bir şekilde (örneğin, read() byte-by-byte çağrısı) okuyorsanız, bir BufferedInputStream kullanmak şeyleri önemli ölçüde geliştirebilir. Ancak, FileInputStream ile zaten makul boyutta bir arabellek kullanıyorsanız, bir BufferedInputStream uygulamasına geçmek önemli değildir.

Çok sayıda çok küçük dosya hakkında konuştuğunuz için, çok fazla gecikmenin, dizin işlemlerinin (açık, kapalı), dosyalardaki baytların gerçek okumasından kaynaklanmadığı gibi güçlü bir olasılık vardır.

İlgili konular