Java нужно хранить значения в многомерном массиве. Каков наилучший способ зарезервировать пространство памяти? - PullRequest
2 голосов
/ 03 декабря 2009

сначала простите за мою плохую грамматику.

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

Первая мысль - использовать int [] [] для хранения этой матрицы (каждый кластер имеет идентификатор типа integer).

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

Спасибо

Ответы [ 4 ]

1 голос
/ 03 декабря 2009

25 миллионов дюймов занимают примерно 100 МБ памяти.

добавление ключа -Xmx256m при выполнении Java должно быть достаточно, если вы собираетесь использовать маршрут int [] [].

, если вы не используетевам не нужно указание int, переходите к сокращению памяти до 50M.

, если большинство значений равно 0, вам определенно следует поискать редкую матричную реализацию.

edit: ifходимость (i, j) всегда равно сходству (j, i), вы также можете использовать это, чтобы сбрить половину.

1 голос
/ 03 декабря 2009

2000 x 2000 в наши дни не так много памяти, так что вы можете просто сделать

int[][] = new int[2000][2000];

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

0 голосов
/ 04 декабря 2009

Будет ли много нулей? Если это так, вам нужно хранить все нули. Существуют стандарты для хранения разреженных матриц, например формат хранения сжатых строк

http://www.cs.utk.edu/~dongarra/etemplates/node373.html

0 голосов
/ 03 декабря 2009

Это действительно потерпит крах? Матрица будет содержать 5000x5000 = 25 миллионов значений int. Я все еще думаю, JVM справится с этим. Вам может понадобиться другая хеш-таблица для отображения значения индекса кластера на массив, но это не так уж и хорошо. Просто увеличьте объем памяти, 32-битная JVM может использовать 2 ГБ ОЗУ, этого достаточно.

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

...