2011-10-17 8 views
2

私は、データがフロート形式で頻繁に使用される画像処理に使用される2つのバイナリファイルを持っています。計算には、カメラが撮影した画像からのピクセルの乗算と加算が含まれます。Androidでバイナリファイルのデータを使用する最も早い方法は何ですか?

現在、ファイルはリソースとして/ resフォルダに保存されており、ファイルを使用するたびにデータが読み込まれ、1つの関数で計算されるたびにDataInputStreamが使用されています。

私はアプリケーション、特にAndroidでファイルを使用するのが比較的新しいので、ファイルからデータを取得する方が良いかどうかを調べたいと思っていました。たとえば、同じデータを何度も繰り返し使用しています。データを読み込んで配列やSQLiteデータベースに格納する方が良いでしょう。これは拡張現実感アプリケーションであるため、処理された画像をほぼリアルタイムで表示する必要があります。

事前に感謝します。

編集:あなたの答えは、別の質問では、Why people say mmap by MappedByteBuffer is faster?ありがとうございました。私は毎回自分のデータを逐次読んでいるので、MappedByteBufferを使用しないでください。 Androidの経験がある人は、最初にデータを読み込んで大きな配列やバッファに格納したり、必要になるたびにストリームから読み続ける方がよいときはいつでも教えてください。全体的に私は約50,000の浮動小数点値を持っています。

+0

どのくらいのデータについて話していますか?また、/ res/rawにデータを格納していることを意味しますか?または/ res/valuesまたは他のどこかで? –

+0

この2部構成の記事(http://imrannazar.com/Augmented-Reality-with-the-Android-NDK:-Part-2)は役に立ちます –

+0

Davidありがとう、私は計算のためのNDKは、私が本当にこの問題を知りたかったのは、大規模な配列を格納する方がストリームからデータを連続的に取るよりも優れているかどうかなど、パフォーマンスに基づいたこの状況でのベストプラクティスです。 Tedの質問に答えるために、ファイルには2576の浮動小数点値が含まれています。 –

答えて

1

Android上でメモリマップファイルを使用することができます。これは、オペレーティングシステムによってメモリにページングされ、メモリが必要になるまで迅速にアクセスできることを意味します。 res/rawセクションまたはassetsセクションからデータファイルシステムにデータファイルをコピーする必要がありますが、その後でMappedByteBufferを使用してアクセスを提供することができます。例:

FileInputStream inputstream = context.openFileInput(DATA_FILE_PATH); 
FileChannel channel = inputstream.getChannel(); 
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); 
buffer.order(ByteOrder.LITTLE_ENDIAN); 
IntBuffer intbuffer = buffer.asIntBuffer(); 

intbuffer.get(index)などを使用して整数のシーケンスとしてアクセスできるようになりました。

関連する問題