Статические структуры данных на встроенных устройствах (в частности, на Android) - PullRequest
2 голосов
/ 02 мая 2010

Я начал работать над некоторыми приложениями для Android, и у меня возник вопрос о том, как люди обычно справляются с ситуациями, когда у вас есть статический набор данных, и есть приложение, где эти данные нужны в памяти как одна из стандартных коллекций Java или как массив.

В моей текущей конкретной проблеме у меня есть электронная таблица с некоторыми предварительно рассчитанными данными. Он состоит из ~ 100 строк и 3 столбцов. 1 столбец - строка, 1 столбец - число с плавающей запятой, 1 столбец - целое число. Мне нужен доступ к этим данным в виде массива в Java.

Кажется, я мог бы:

1) Кодирование в XML - в моем опыте это было бы очень сложно для декодирования.

2) встроить в базу данных SQLite - кажется, что для статического доступа к данным требуются большие затраты, мне нужен только доступ в стиле массива в оперативной памяти.

3) Создайте двоичный двоичный объект и прочитайте его (никогда не делали этого на Java, я скучаю по void *)

4) Создайте скрипт на python, чтобы взять CSV-версию моих данных, и выложите Java-функцию, которая добавляет значения к моей желаемой структуре с жестко закодированными значениями.

5) Сохранение строкового массива с помощью механизма ресурсов Android и вычисление двух других столбцов при загрузке приложения. В моем случае для вычислений потребовалось бы много обращений к Math.log, Math.pow и Math.floor, что я не хотел бы делать из-за времени загрузки и использования батареи.

В основном я работаю со встроенными приложениями с низким энергопотреблением в C, и поэтому я в таких ситуациях привык к # 4.

Просто кажется, что получить доступ к статическим структурам данных в java / android гораздо проще.

Возможно, я просто слишком сильно разбираюсь в использовании батареи, и в моем единственном случае я думаю, что ответ заключается в том, что это не имеет большого значения, но если бы каждое приложение заняло такую ​​позицию, это могло бы начать иметь значение.

Какие подходы люди обычно используют в этой ситуации? Что-нибудь, что я пропустил?

Ответы [ 3 ]

3 голосов
/ 02 мая 2010

Я бы пошел модифицированный # 5:

strings.xml

<string-array name="some_data">
    <item>string|0.56|100</item>
</string-array>

Parser.java

String[] arr = getResources().getStringArray(R.array.some_data);
for (String str : arr) {
    string[] columns = str.split("|");
    // to Java objects or parallel arrays
}

Microbenchmark:

<string-array name="data">
    <item>some0|10|1.0</item>
    ...
    <item>some99|199|1.99</item>
</string-array>

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        long start = System.currentTimeMillis();
        String[] arr = getResources().getStringArray(R.array.data);
        ArrayList<Triple> triples = new ArrayList<Triple>();
        for (String s : arr) {
            String[] parts = s.split("\\|");
            Triple tr = new Triple();
            tr.str = parts[0];
            tr.i = Integer.valueOf(parts[1]);
            tr.f = Float.valueOf(parts[2]);
            triples.add(tr);
        }
        System.out.println(System.currentTimeMillis() - start);
        return true;
    }

    static class Triple {
        public String str;
        public int i;
        public float f;
    }

05-02 21:17:50.418: INFO/System.out(609): 125
05-02 21:17:51.128: INFO/System.out(609): 124
05-02 21:17:52.368: INFO/System.out(609): 124
05-02 21:17:53.158: INFO/System.out(609): 127
05-02 21:17:53.858: INFO/System.out(609): 123
05-02 21:17:54.688: INFO/System.out(609): 124
05-02 21:17:55.778: DEBUG/dalvikvm(609): GC freed 14380 objects / 525008 bytes in 136ms

На 1.6 ADP1 .

2 голосов
/ 02 мая 2010

Я бы пошел # 4, если вы уверены, что это должно быть в памяти все время. Другие варианты включают JSON, структуру данных в кодировке Thrift или структуру данных в кодировке буфера протокола.

1 голос
/ 02 мая 2010

Для (3) вы можете использовать ObjectInputStream , созданный из FileInputStream (см. Javadoc на уровне класса, чтобы узнать код копирования + вставки), чтобы десериализовать ваши Объекты из двоичных данных, хранящихся в файл.

Чтобы создать двоичный файл, используйте ObjectOutputStream и FileOutputStream аналогично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...