2011-10-17 5 views
2

데이터가 플로트 형식이며 자주 사용되는 이미지 처리에 사용되는 2 진 파일이 있습니다. 이 계산에는 카메라로 촬영 한 이미지의 픽셀 곱셈 및 추가가 포함됩니다.Android에서 이진 파일의 데이터를 사용하는 가장 빠른 방법은 무엇입니까?

현재 파일은/res 폴더에 리소스로 저장되며 파일을 사용할 때마다 데이터를 읽고 계산하는 단일 함수로 DataInputStream을 사용하고 있습니다.

특히 Android에서 파일을 사용하는 것이 비교적 새로운데, 파일에서 데이터를 가져 오는 것이 더 나은 방법인지 확인하고 싶습니다. 예를 들어 같은 데이터를 반복해서 사용하고 있습니다. 다시 한 번 데이터를 읽고 배열이나 SQLite 데이터베이스에 저장하는 것이 더 좋습니다. 이것은 증강 현실 응용 프로그램이므로 처리 된 이미지를 거의 실시간으로 표시해야합니다.

미리 감사드립니다.

편집 : 귀하의 답변에 Patthoyts가 다른 질문인데, Why people say mmap by MappedByteBuffer is faster? 주셔서 감사합니다. 필자는 매번 데이터를 순차적으로 읽으므로 MappedByteBuffer를 사용하지 않아도된다는 내용을 읽었습니다. 안드로이드에 대한 경험이있는 사람은 처음부터 데이터를 읽어 큰 배열이나 버퍼에 저장하거나 필요할 때마다 스트림에서 계속 읽는 것이 더 나을 때마다 알려줄 수 있습니까? 전반적으로 약 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) 등을 사용하여 정수의 순서로 액세스 할 수 있습니다.

관련 문제