2016-04-10 31 views
0

1 GB'lık büyük boyutlu bir dosyayı sıkıştırmayı deniyorum ve dosya çıkış akışı yöntemini kullanamıyorum. Son belgem, yeni bir dosya oluşturmak için sıkıştırılmış dosyanın bayt dizisini gerektirir. Şimdilik, her bir okuma için el ile dizi boyutunu büyütüyorum. Ancak bu büyük dosyalar için çok yavaş. Bu yöntemde verimlilik elde etmenin herhangi bir yolu var mı?System.arrayCopy() yöntemi yerine java'da bayt dizisi birleştirilir.

 if (primaryDocumentInputStream != null) { 
    byte[] tempbuffer = new byte[536870912]; 
    byte[] mainbuffer = new byte[536870912]; 
    int lenMainBuffer = 0; 
    try { 
    int aIntBuffer = aGZIPInputStream.read(tempbuffer); 
    while (aIntBuffer > 0) { 
     byte[] copyBuffer = new byte[lenMainBuffer + aIntBuffer]; 
     System.arraycopy(mainbuffer, 0, copyBuffer, 0, lenMainBuffer); 
     System.arraycopy(tempbuffer, 0, copyBuffer, lenMainBuffer, aIntBuffer); 
     mainbuffer = copyBuffer; 
     aIntBuffer = aGZIPInputStream.read(tempbuffer); 
     lenMainBuffer = mainbuffer.length; 
    } 
    primaryDocumentOutputDocument.setBody(mainbuffer); 
    wfc.putPrimaryDocument(primaryDocumentOutputDocument); 

    } 
+0

Tamponların bir listesini saklayabilir ve sonunda yalnızca bir ayırma/kopyalama yapabilirsiniz. Ya da daha büyük bir başlangıç ​​tamponu kullanırsınız (bilinen genişletilmiş boyutu kullanarak). Ancak, nihayetinde, tek bir büyük bayt dizisinin yeniden tasarlanmasını gerektirdiğini düşündüğünüz yöntem. – eckes

cevap

3

Verilerinizi bir ByteArrayOutputStream yazın. Bir bayt dizisi sarar ve gerektiğinde yeniden boyutlandırır. Bittiğinde, toByteArray numaralı telefonu arayarak bayt döndürür.

ByteArrayOutputStream ile burada yazdıklarınız arasındaki farklardan biri, yedekleme dizisinin boyutunu iki katına çıkaran tipik uygulamaların, n bayt yazma işleminin O (n) amortize edilmiş zaman karmaşıklığına sahip olduğu anlamına gelir. Diziyi burada olduğu gibi sabit artışlarla büyütürseniz, O (n^2) zaman karmaşıklığını elde edersiniz.

+0

Ne daha verimli, aynı şeyi yapıyor, ancak kod ile kendiniz yazıyor musunuz? Hayır, hata yapmadıkça ve daha kötüsü olan bir şeyi yazmadıkça, verimli olacak. – Joni

+0

Soruda yaptığım koddan daha verimli. Yardımın için teşekkürler.) (Java yığın alanı ByteArrayOutputStream verileri = new ByteArrayOutputStream;: Ben bu şekilde kodu güncellenen ama bu hatayı alıyorum: dizisindeki İstisna "ana" java.lang.OutOfMemoryError try int aIntBuffer = gZIPInputStream.read (buffer); (aIntBuffer> 0) { \t data.write (buffer); } –

+0

Bu, JVM'nin tüm sıkıştırılmış verileri tutmak için yeterli belleğe sahip olmadığı anlamına gelir. Dosyada 1GB veri varsa, yığın boyutunu en az 3 veya 4 GB'ye çıkarmalısınız. Önceki yorum, bu arada yorumlarını sildikten sonra, başka bir kişiye yanıt olarak verildi. – Joni