2012-06-20 8 views
12

私は、次の両方を使用しますが、あなたはおそらくメモリに全体の12メガバイトを割り当ててみた後、かどうかを確認する必要があり、巨大なdata..ofのために12メガバイトURLから12MBのテキストデータをダウンロードし、SDカードに保存してください...ヒープメモリの問題が発生しました。任意のソリューションですか?

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

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

私はSDカードに保存されている場合、私は.. ..単一の文字列で非常に全体のxmlの必要性を、XMLをパースしていた後も、私はまた、ある文字列でそれを読むために持っているより多くのヒープメモリを必要と...結果はクラッシュ..です –

答えて

-1

あなたが可能な場合は、XMLファイルを分割して、文字列にそのファイルを読み込み、それを解析しようとする必要があり、私は同じ問題を抱えていたし、私はこの1つを使用します。

+0

おかげで、これはあまりにも私のために良いアイデアを募集しています。 。:) –

+0

は、あなたがXMLの一部を解析する予定のない人に説明することはできますか?私が知っていることから無効になるでしょう。 –

1

を動作していません割り当ては成功します。次に、データをバッファにロードします。

ファイルを部分的に読み込んで処理できる場合は、この方法で効率的でなければなりません。

2

XMLをチャンクで読み込んで各チャンクをSDカードに保存しないのはなぜですか?このソリューションの唯一の問題は、XMLのパーツを動的にロードして解析するためのXMLストリームパーサーが必要なことです。

StaXというXML用のStreaming APIを使用して、このケースのカスタム入力ストリームを作成することができます。いくつかの例http://www.vogella.com/articles/JavaXML/article.html#javastax

8

SDカードにチャンク内のデータを保存します。その後、Androidの組み込みのXmlPullParser、以前に保存したファイルを解析することができ、次の方法使用:

  1. オープンしたばかりの
  2. 使用方法setInput(InputStream inputStream, String inputEncoding)
  3. 楽しんをダウンロードしたファイルの入力ストリームを解析中この巨大なXMLファイル。
2
  1. XmlPullParserインスタンスご入力(Readerまたは入力ストリームのいずれか)と
  2. コールXmlPullParser.setInputを作成します。あなたがダウンロードしたデータ(ソケットまたは他の方法で)
  3. XmlPullParserの関数を使用してxmlテキストファイルを解析します。

注:非メインスレッドでこれを行う必要があります。ファイルをダウンロードするのに時間がかかることがあります。 (とにかく、UIスレッドでネットワークタスクを実行することはできません)。 これはメモリ効率がよく、XmlPullParserはデータをメモリにキャッシュしません。最初にファイルをSDカードに保存する必要はありません。

接続のタイムアウト、xmlのエラーなども監視してください。パーサーがドキュメントの終わりに達したと報告すると、ジョブは成功とみなされます。部品で

3

読み取り、データが

1

を解析するためのSAXParserを使用& 1MBあなたは全体のXMLストリームを解析して一つの巨大なDOMオブジェクトを作成する必要がありますか、または解析するチャンクは何でしょうか?

あなたが行うことができる唯一のことよりも完全なXMLを解析しなければならないなら、より多くのメモリと64ビットOSを得ることです。
そうでない場合は、SAXまたはStAXパーサーを使用して、チャンクをストリームから直接取得するか、ローカルで保存した後で解析します。

1

ユーザーの必要と述べたとおり、チャンクでチャンクをダウンロードすることをお勧めします。ファイル全体を一度にダウンロードすることはお勧めしません。メイントレッドですべてのアプリケーションを減速させる可能性があるため、asynctaskそれはチャンクでチャンクします。 それ以外は、私はあなたにトピックに関するいくつかの投稿をお勧めすることができます。

-In thisポスト私は、この2件の記事が役立つことを願って、あなたが別のSAX and DOM tutorial

を見つけることができる程度how to use SAX

-In this 1記事へのリンクを見つけることができますあなたは必要なものを達成します。または両方の記事があなたの問題で失敗した場合、その後、あなたはXMLを手配するためのより良い方法を見つけることを試みることがあり、それを行うための良い方法は常にある、あなたは少し難しく考える必要があります。

UPDATE:

- この他のポストを約STAX役立つかもしれない、原因はXML処理用のストリーミングAPIであるので、それはあなたのケースのための最高であってもよいです。

+0

なぜ代わりにあなたの質問を再開しようとしている、あなたはより良い別の同様の質問の検索を開始、またはそれをより見やすくできるようにあなたの質問を再実行し、それが開いなっても、私はそれのために明るい未来を見ていないが発生します。しかし、おそらくこの1つは(http://stackoverflow.com/questions/1357403/how-to-cartoon-ify-an-image-programmatically)[CARTOONIFYING ABOUT POSTを]あなたを助けることができる –

関連する問題