массив структур или структура массивов? - PullRequest
6 голосов
/ 14 июля 2009

Хммм. У меня есть таблица, которая представляет собой массив структур, которые мне нужно хранить в Java. Наивный подход «не беспокойся о памяти» гласит: «1001 *»

public class Record {
  final private int field1;
  final private int field2;
  final private long field3;
  /* constructor & accessors here */
}

List<Record> records = new ArrayList<Record>();

Если я в конечном итоге использую большое количество (> 10 6 ) записей, к которым иногда обращаются к отдельным записям по одному, как бы я выяснил, как предшествующий подход (ArrayList) сравнил бы с оптимизированным подходом к затратам на хранение:

public class OptimizedRecordStore {
  final private int[] field1;
  final private int[] field2;
  final private long[] field3;

  Record getRecord(int i) { return new Record(field1[i],field2[i],field3[i]); }
  /* constructor and other accessors & methods */
}

редактирование:

  • предположим, что # записей - это то, что меняется редко или никогда
  • Я, вероятно, не собираюсь использовать подход OptimizedRecordStore, но я хочу понять проблему стоимости хранилища, чтобы я мог с уверенностью принять это решение.
  • очевидно, если я добавлю / изменим количество записей в подходе OptimizedRecordStore выше, мне придется либо заменить весь объект новым, либо удалить ключевое слово "final".
  • kd304 поднимает хороший вопрос, который был у меня в голове. В других ситуациях, подобных этому, мне нужен доступ к столбцам записей, например, если field1 и field2 - это "time" и "position", и для меня важно получить эти значения в виде массива для использования с MATLAB, поэтому я могу эффективно их графически / анализировать.

Ответы [ 11 ]

1 голос
/ 14 июля 2009

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

Редактировать Вы также можете использовать общую матрицу long[][]. Я не знаю, как вы передаете столбцы в Matlab, но, полагаю, вы не получаете большую скорость с хранилищем на основе столбцов, скорее всего, вы теряете скорость в вычислениях Java.

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