Java и управление памятью - PullRequest
3 голосов
/ 12 января 2010

Я новичок в мире Java из C ++ фона. Я хотел бы перенести некоторый код C ++ на Java. В коде используются разреженные векторы:

struct Feature{
int index;
double value;
};

typedef std::vector<Feature> featvec_t;

Как я понял, если кто-то создаст объект, будут некоторые накладные расходы на использование памяти. Таким образом, наивная реализация Feature будет значительно перегружена, когда в наборе featvec_t будет 10-100 миллионов функций.

Как эффективно представить эту структуру памяти в Java?

Ответы [ 4 ]

6 голосов
/ 12 января 2010

Если память действительно является вашим узким местом, попробуйте сохранить ваши данные в двух отдельных массивах: int[] index и double[] value.

Но в большинстве случаев при таких больших структурах производительность (время) будет основной проблемой. В зависимости от операций, которые в основном выполняются над вашими данными (вставка, удаление, получение и т. Д.), Вам необходимо выбрать подходящую структуру данных для хранения объектов класса Feature. Начните исследования с java.util.Collection интерфейсом, его подынтерфейсами (List, Set и т. Д.) И их реализациями, представленными в пакете java.util.

5 голосов
/ 12 января 2010

Чтобы избежать перегрузок памяти для каждой записи, вы можете написать java.util.List<Feature> реализацию, которая оборачивает массивы int и double и создает объекты Feature по требованию.

Для автоматического изменения размера вы можете использовать TIntArrayList и TDoubleArrayList из GNU trove .

1 голос
/ 12 января 2010

Вопрос о пространстве для самой структуры или разреженного вектора? Поскольку другие ответили на первое, я буду стрелять на второе ...

Насколько мне известно, в стандартных коллекциях Java нет разреженных списков / матриц.

Вы можете создать эквивалент, используя TreeMap, привязанный к индексу.

0 голосов
/ 12 января 2010

Объект в Java (я полагаю) имеет:

  • SizeOf (индекс)
  • SizeOf (значение)
  • sizeof (Class *) <- указатель на конкретный класс </li>

Таким образом, разница составляет четыре байта от указателя. Если ваша структура 4 + 8 = 12 байт, это 33% накладных расходов ... но я не могу придумать другой (лучший) способ сделать это.

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