2012-06-20 8 views
12

Io uso sia di seguire, ma non funziona per enorme data..of 12 mb12 mb di dati di testo scaricati dall'URL e salvati su scheda SD ... Si verificano problemi di memoria di heap. qualche soluzione?

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

e

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

Sto analizzando xml .. quindi tutto xml è necessario in una stringa singola .. se ho memorizzato nella scheda sd allora devo anche leggerlo in una stringa che richiede anche più memoria heap ... il risultato è crash .. –

risposta

-1

Ho avuto lo stesso problema e uso questo, dovresti dividere il file xml se possibile e quindi provare a leggere quel file in stringa e analizzarlo.

+0

Grazie anche per me è una buona idea. . :) –

+0

Puoi spiegare chi intendi analizzare una parte di XML? Sarà invalido da ciò che so. –

1

Probabilmente si dovrebbe provare a destinare l'intero 12 MB nella memoria e quindi verificare se il l'allocazione ha successo. Quindi caricare i dati nel buffer.

Oppure, se è possibile caricare il file in parti ed elaborarlo, dovrebbe essere efficiente in questo modo.

2

Perché non leggere il tuo XML in blocchi e salvare ogni blocco sulla scheda SD? L'unico problema in questa soluzione è che hai bisogno di un qualche tipo di parser di flusso XML usando il quale puoi caricare dinamicamente parti del tuo XML e analizzarle.

Può essere possibile utilizzare l'API di streaming per XML, denominato StaX, e scrivere flusso di input personalizzato per questo caso. Alcuni esempi http://www.vogella.com/articles/JavaXML/article.html#javastax

2
  1. Creare esempio XmlPullParser
  2. chiamata XmlPullParser.setInput con il vostro ingresso (o Reader o InputStream); cioè i dati che scarichi (per Socket o altro)
  3. Usa le funzioni di XmlPullParser per analizzare il tuo file di testo xml.

Nota: è necessario eseguire questa operazione sul thread non principale, potrebbe essere necessario molto tempo per scaricare il file. (In ogni caso non è possibile eseguire attività di rete sul thread dell'interfaccia utente). Questo dovrebbe essere efficiente in termini di memoria, XmlPullParser non memorizza nella cache i dati in memoria. Non è necessario prima archiviare il file sulla scheda SD.

Controllare anche gli errori: timeout della connessione, errori in xml, ecc. Trattare il lavoro come positivo quando il parser segnala di aver raggiunto la fine del documento.

3

lettura in parti 1MB di dati & uso SAXParser per il parsing

1

Avete bisogno di analizzare tutto il flusso XML e creare un enorme oggetto DOM, o saranno parsing pezzi fanno?

Se è necessario analizzare l'XML completo, l'unica cosa che si può fare è ottenere più memoria e sistema operativo a 64 bit.
In caso contrario, utilizzare il parser SAX o StAX per ottenere e analizzare i blocchi direttamente dallo stream o dopo averlo salvato localmente.

1

Come dichiarato dal mosto dell'utente, vorrei raccomandare il download di chunk di chunk e non dell'intero file in una volta, perché se lo stai facendo sul battistrada principale può rallentare tutta la tua applicazione, quindi fallo con asynctask e fallo da pezzo. A parte ciò posso consigliarti qualche post sull'argomento.

-In this post potete trovare un link ad un articolo su how to use SAX

-In this quella che si può trovare un altro SAX and DOM tutorial

Spero che questi due articoli possono aiutare ottieni ciò di cui hai bisogno. Oppure se entrambi gli articoli falliscono con il tuo problema, allora potresti provare a trovare un modo migliore per organizzare il tuo XML, c'è sempre un modo migliore per farlo, devi solo pensare un po 'più difficile.

UPDATE:

-Questo altro post su STAX può essere utile, perché è un'API di streaming per l'elaborazione XML, quindi potrebbe essere la migliore per il vostro caso.

+0

Perché, invece di cercare di riaprire la tua domanda, è meglio iniziare a cercare altre domande simili, o rifare la domanda in modo che possa essere più leggibile, perché anche se si apre, non vedo un futuro brillante per essa. MA forse questo può aiutarti [POST SU CARTOONIFYING] (http://stackoverflow.com/questions/1357403/how-to-cartoon-ify-an-image-programmatically) –