2012-06-20 16 views
12

aşağıdaki iki kullanabilirsiniz, ancak 12 mb12 mb metin verisi url'den indirme ve sd karta kaydet ... Yığın belleği probu meydana geliyor. herhangi bir çözüm?

char[] chars = new char[1024]; 
int len; 
while((len=buffer.read(chars))>0) { 
    data.append(chars,0,len); 
} 

ve

while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
} 
+0

Ben xml .. ayrıştırıyorum ben xml .. tek bir dize ihtiyacı .. Eğer sd kartında saklanırsa o zaman aynı zamanda daha fazla yığın bellek gerektiren dizede okumak zorundayım ... sonuç çöküyor .. –

cevap

-1

Aynı sorunu yaşadım ve bunu kullanıyorum, mümkünse xml dosyasını bölmeli ve sonra bu dosyayı dize okumaya ve ayrıştırmaya çalışmalısınız.

+0

Teşekkürler bu benim için de iyi bir fikir. . :) –

+0

XML'in bir bölümünü ayrıştırmayı planladığınızı açıklayabilir misiniz? Bildiğimden geçersiz olacak. –

1

Muhtemelen belleğe tüm 12MB tahsis denemek ve daha sonra kontrol etmelidir data..of büyük için çalışmıyor ayırma başarılı olur. Ardından verileri arabelleğe yükleyin. Eğer bölgelerinde dosyası yüklemek ve bunları işlemek mümkün olup olmadığını

Veya, bu şekilde verimli olmalıdır.

2

Neden parçalar halinde XML'inizi okuyup SD karta her öbek kurtarmaya değil? Bu çözümdeki tek sorun, XML'in parçalarını dinamik olarak yükleyebileceğiniz ve ayrıştırabileceğiniz bir çeşit XML akış ayrıştırıcısına ihtiyacınız olmasıdır.

Eğer StAX denilen XML için Akış API kullanın ve bu durum için özel giriş akışı yazabilir olabilir. Bazı örnek http://www.vogella.com/articles/JavaXML/article.html#javastax

2
  1. XmlPullParser örneğini girişiniz (Reader veya inputStream ya) ile
  2. Çağrı XmlPullParser.setInput oluşturun; indirdiğiniz veriler (Soket veya başka bir yolla)
  3. Xml metin dosyanızı ayrıştırmak için XmlPullParser işlevlerini kullanın.

Not: Bunu ana iş parçacığı üzerinde yapmanız gerekir, dosyayı karşıdan yükleme uzun sürebilir. (Yine de UI iş parçacığı üzerinde ağ görevi yapamazsınız). Bu bellek verimli olmalı, XmlPullParser bellekteki verileri önbelleğe almaz. Dosyayı önce SD karta kaydetmeye gerek yok.

Ayrıca hatası olup olmadığına bakın: çözümleyici belgenin sonuna gelmiş olduğunu bildiriyor, bağlantı zaman aşımları, xml hataları, vb başarı olarak işinizi davranın. yerlerinde

3

okuma

1

ayrıştırmak için veri & kullanım SAXParser 1MB Eğer bütün XML akışı ayrıştırmak ve bir büyük DOM nesnesi oluşturmak gerekir, ya da parçaları yapmak ayrıştırma olacak mı?

sen yapabileceğiniz tek şey daha tam XML ayrıştırmak GEREKİR Eğer daha fazla bellek ve 64bit işletim elde etmektir.
Değilse, doğrudan akıştan veya yerel olarak kaydettikten sonra parçaları almak ve ayrıştırmak için SAX veya StAX ayrıştırıcısı kullanın.

1

Kullanıcı tarafından belirtildiği gibi, tüm dosyayı bir kerede yığın olarak değil, yığın halinde indirmenizi tavsiye ederim, çünkü ana sırtında yapıyorsanız, tüm uygulamalarınızı yavaşlatabilir, bu nedenle asenkronize edin ve Bunu yığınla öde. Bunun dışında size konu hakkında bazı yazı tavsiye edebilirim.

-In this sonrası sen bu iki madde yardımcı olabilir umut başka SAX and DOM tutorial

bulabilirsiniz yaklaşık how to use SAX

-In this biri bir makale bir link bulabilirsiniz İhtiyacınız olanı elde edersiniz. Her iki Makaleler sorunla başarısız Veya, o zaman sadece biraz daha sert düşünmek gerekir, bunu yapmanın daha iyi bir yolu her zaman vardır, XML'inizi düzenlemek için daha iyi bir yol bulmaya çalışabilir.

GÜNCELLEME:

-Bu diğer sonrası yaklaşık STAX yararlı olabilir, çünkü XML işleme için bir akış Api, bu yüzden dava için iyi olabilir.

+0

Neden yerine sorunuzu yeniden açmak için çalışmakla açık alır bile, ben bunun için parlak bir gelecek görmüyorum neden, daha iyi başka benzer soruları aramaya başlar, ya da daha okunaklı olabilir böylece sorunuzu yeniden yapmak. AMA belki bu size yardımcı olabilir [KARTON HAKKINDA POSTA] (http://stackoverflow.com/questions/1357403/how-to-cartoon-ify-an-image-programmatically) –

İlgili konular