SORU
22 EKİM 2009, PERŞEMBE


FileOutputstream performans FileChannel karşı Java NİO / kullanışlılık

Eğer nio FileChannel karşı FileInputStream/FileOuputStream normal ve dosyaları dosya sistemine okuma ve yazma için kullanırsan performansında herhangi bir fark veya avantaj) olup olmadığını anlamaya çalışıyorum. Benim makinede de aynı düzeyde gerçekleştirmek için de bir çok kez FileChannel yol daha yavaş olduğunu gözlemledim. Daha fazla bilgi, bu iki yöntem karşılaştırıldığında bilir miyim lütfen. İşte bu kodu kullandım 350MB buralarda mı ile test ediyorum dosyayı. Dosya için NİO göre sınıfları kullanmak için iyi bir seçenek eğer random access veya benzeri gelişmiş özellikler bakıyorum eğer O/, değil mi?

package trialjavaprograms;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class JavaNIOTest {
    public static void main(String[] args) throws Exception {
        useNormalIO();
        useFileChannel();
    }

    private static void useNormalIO() throws Exception {
        File file = new File("/home/developer/test.iso");
        File oFile = new File("/home/developer/test2");

        long time1 = System.currentTimeMillis();
        InputStream is = new FileInputStream(file);
        FileOutputStream fos = new FileOutputStream(oFile);
        byte[] buf = new byte[64 * 1024];
        int len = 0;
        while((len = is.read(buf)) != -1) {
            fos.write(buf, 0, len);
        }
        fos.flush();
        fos.close();
        is.close();
        long time2 = System.currentTimeMillis();
        System.out.println("Time taken: " (time2-time1) " ms");
    }

    private static void useFileChannel() throws Exception {
        File file = new File("/home/developer/test.iso");
        File oFile = new File("/home/developer/test2");

        long time1 = System.currentTimeMillis();
        FileInputStream is = new FileInputStream(file);
        FileOutputStream fos = new FileOutputStream(oFile);
        FileChannel f = is.getChannel();
        FileChannel f2 = fos.getChannel();

        ByteBuffer buf = ByteBuffer.allocateDirect(64 * 1024);
        long len = 0;
        while((len = f.read(buf)) != -1) {
            buf.flip();
            f2.write(buf);
            buf.clear();
        }

        f2.close();
        f.close();

        long time2 = System.currentTimeMillis();
        System.out.println("Time taken: " (time2-time1) " ms");
    }
}

CEVAP
6 Kasım 2009, Cuma


Dosya boyutları ile benim deneyim java.nio Daha hızlı java.io den olmuştur.Sağlam daha hızlı.

Tampon boyutu.Temelde bu algoritma

  • disk tampon kopyalayın
  • disk tampon kopyalayın

Benim kendi deneyimlerinden, bu arabellek boyutu olmuşturolgunayarlama için. Benim uygulama, 256 KB için başka bir bölümü için 4KB karar verdim. Kodunuz böyle büyük bir tampon ile acı olduğunu düşünüyorum. 1 KB, 2 KB, 4 KB, 8 KB, 16 KB, 32 KB ve 64 KB arabellek ile bazı kriterler kendine bunu kanıtlamaya çalışma.

Aynı disk okuma ve yazma java kriterler yapmazlar.

Eğer bunu yaparsan, o zaman gerçekten disk karşılaştırma ve Java. Ayrıca eğer CPU meşgul ise, o zaman muhtemelen başka bir şişe boyun deneyimi olduğunu öneririm.

Eğer ihtiyacınız varsa bir tampon kullanmayın.

Neden eğer hedef başka bir disk veya bir NİC ise belleğe kopyalamak? Daha büyük dosyalar ile, gecikme incured önemsiz değil.

Diğer dediği gibi, FileChannel.transferTo() FileChannel.transferFrom() kullanın. Anahtar burada avantajı JVM varsa DMA (Direct Memory Access), OS erişim kullanır.(Bu uygulamaya bağlıdır, ancak genel amaçlı İşlemciler üzerinde modern Sun ve IBM sürümleri hazır.)Ne verileri düz destination...by RAM veya CPU ile herhangi bir devre geçen otobüs, daha sonra Disk/gider.

Gün ve gece çalışan benim harcadım web uygulaması IO ağır. Mikro kriterler ve dünya gerçek testleri yaptım. Ve sonuçları bloguma, bir bakmam lazım

Üretim verileri ve ortamları kullanın

Mikro-kriterler bozulma eğilimli. Eğer yapabilirsen, beklediğiniz donanım yapmak istediğinizi verileri, yük ile beklediğiniz bir araya getirmek için çaba.

Bir üretim sisteminde yer aldılar çünkü benim kriterler sağlam ve güvenilir, etli bir sistem, yük altında bir sistem, günlükleri bir araya geldi.Değilnot defterim 7200 RPM 2.5 yoğun JVM iş olarak izlerken" SATA sabit disk sürücü.

Sen neden kaçıyorsun? Önemli.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Derek Banas

    Derek Banas

    12 AĞUSTOS 2008
  • IGN

    IGN

    19 EYLÜL 2006
  • ::..ηєѕѕ мιχ..::

    ::..ηєѕѕ

    15 Aralık 2006