2013-05-02 3 views
0

레거시 장치의 16 비트 코드를 테이블에 정의 된대로 문자열로 변환합니다. 2,000 개가 넘는 코드가 있으며 코드는 연속적이지 않습니다. 그들은 현재이 같은의 HashMap에 정의되어프로그램 메모리의 큰 정적지도 Java

...

public class SomeActivity { 
    private static final Map<Integer, String> myMap; 
    static { 
     Map<Integer, String> aMap = ...; 
     aMap.put(0x2345, "this"); 
     aMap.put(0xFEA3, "that"); 
     ... 
     myMap = Collections.unmodifiableMap(aMap); 
    } 
} 

이 안드로이드 포팅되고, 나는이 장치에서 최대 사용 얼마나 많은 RAM이 걱정됩니다. 비슷하지만 프로그램 메모리에 저장할 수 있습니까?

+2

속성 파일을 사용할 수 없습니까? –

+0

@ user503413 예제를 제공해 주시겠습니까? – firyice

+3

RAM이 아닌 경우 "프로그램 메모리"는 무엇이라고 생각하십니까? 문제가 있는지 실제로 테스트 했습니까? (2000 년지도 엔트리에 대해 * 많은 메모리를 차지하지 않을 것입니다.) –

답변

1

SparseArray (http://developer.android.com/reference/android/util/SparseArray.html)이 기본 HashMap보다 적합합니다.

를 사용하여 프로그램의 자산에 넣어 당신은 또한 속성 파일 ( http://developer.android.com/reference/java/util/Properties.html 참조) 것을 넣을 수

당신도 미리 수 (당신은 여전히 ​​1 개 값을 읽어 메모리에있는 모든 파일을로드 할 수 있습니다) - sqlite 데이터베이스를 만들어 애셋에서 복사하십시오 (http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ 참조). 이 경우 값은 파일에 있고 필수 요소 만로드됩니다.

그러나 문자열이 너무 길지 않으면 RAM에 약 2000 개의 항목이 걱정되지 않습니다.

2

코드가 연속적이지 않을 수 있지만 상당히 밀도가 높은 경우 (즉, min(keys)max(keys) 사이의 숫자가 높습니다 (예 : 75 % 이상), 미리 작성하여 일부 공간을 절약 할 수 있습니다. String[] 크기가 max(keys)-min(keys) 인 개체를지도처럼 사용하십시오.

안드로이드 개발을위한/옵션 인 경우 기본지도 및 기타 데이터 구조에 대한 또 다른 훌륭한 대안은 Trove library으로 원시 데이터 구조로 작업 할 때 많은 공간과 시간을 절약 할 수 있습니다. 이 자동 권투 프리미티브를 방지 Trove를,만큼 효율적 아니지만, 자바의 표준의 HashMap (though slightly slower)보다 더 효율적으로 더 많은 메모리 - 당신은 전화 때문에

또는 Collections.unmodifiableMap() 구아바의 ImmutableMap을 고려하십시오.

즉, 의견에서 알 수 있듯이 아무 것도 걱정하지 않을 수도 있습니다. 늘 그렇듯이 "조기 최적화는 모든 악의 뿌리입니다." 그것은 아주 간단한 Java HashMap이 당신에게 잘 돌아갈 것 같습니다.

관련 문제