2011-06-30 14 views
2

Android搭載デバイスのSDカード(〜60MB)にかなり大きなファイルをダウンロードしています。ダウンロードはうまくいっていますが、このファイル全体をメモリに保存する必要があります。私はそれがスマートフォンのためのメモリの巨大なチャックだと知っていますが、私のデバイスがその倍以上の量を持っていることは分かっています。とにかく、私の実際の問題は、ファイルをバイト配列に読み込むときにOutOfMemoryErrorになります。私のアプリケーションのために割り当てられたメモリを増やす方法はありますか、ファイルを参照してファイルを "偽造"しても、ファイルを内部メモリにロードせずに外部ストレージに保存する方法はありますか?Androidで大量のデータを読み込んだときのOutOfMemoryError

+0

あなたは 'InputStream'でバッファサイズをあらかじめ割り当てることができませんか?多分それを試してみてください。すべてのアプリがガベージコレクションなしで持っているためには60MBがたくさんあります。とにかく、Androidのいずれかのポイントで多くのデータをリースすると思います。また、データをバイト配列の配列に分割することもできます。 – hwrdprkns

+0

あなたの質問は十分ではありません。どのような種類のデータを扱おうとしていますか? –

答えて

4

Androidの各仮想マシンインスタンスには、VM予算というものがあります。これは、基本的に、アプリ全体が占めることができるメモリの最大量です。 getRuntime()。maxMemory()は、現在のインスタンスのVMの予算サイズを返します。

予算は、16MB(G1)から48MB(Moto Xoom)のどこでもかまいません。私の頭の上から覚えているように、それらの数字は異なるかもしれません。

通常、このような場合は、データをInputStreamとして読み込み、データを読み取るときにデータを処理しますが、データ自体は保持しません。

これがビットマップの場合。あなたは使用することができます...

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 4; // Divides the width and height each by 4 when reading the data in. 
Bitmap bitmap = BitmapFactory.decodeFile(String "filePath", options); 
Bitmap bitmap = BitmapFactory.decodeStream(InputStream "fileStream", options); 
+1

G1の場合は16MBでした。 –

+0

ありがとう、コメントを更新しました。私はhttp://developer.android.com/resources/dashboard/screens.htmlで、実際のデバイスごとの仕様で、メモリクラスのチャートを持っているといいですね。 –

+1

それはかなり簡単です: –

1

簡単な答えは、あなたの現在のデザインを本当に再考する必要があります。なぜ60MBのデータをメモリにロードする必要があるのか​​説明できますか?

+0

このデータ量は、可能であればデータベースを魅力的にするでしょう – Snicolas

+0

それは私有のバイナリファイルです。このファイルを読むために与えられたライブラリは、バイト配列として全体を必要としています...だから私は少しですその点で制限されています。 –

+0

それは難しいです。他にも考慮すべき点があります。多分、サーバー/クライアントの関係でデコードするための専用のプロセス/スレッドがあるかもしれません。意味は、ファイルをサーバー上で処理してから、クライアントにダウンロードしてストリーミングまたは表示することです。これは、必要な再設計の単なる例です。がんばろう。 – Maurycy

関連する問題