Что еще я могу использовать вместо HashMap? - PullRequest
0 голосов
/ 15 июля 2010

В моем проекте я получаю записи формы с двух серверов и сохраняю их в хэш-карте.

ключ равен serverName, а значение равно 2d ArrayList (ArrayList<ArrayList<Object>>)

в ArrayListЯ сохраняю значения полей, которые принадлежат форме на этом сервере.Я сравниваю эти значения на двух серверах и печатаю их в файл Excel.

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

Ответы [ 4 ]

5 голосов
/ 15 июля 2010

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

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

2 голосов
/ 15 июля 2010

HashMap не является проблемой здесь.Какие объекты на самом деле содержатся в ArrayList<ArrayList<Object>>?

Вы действительно должны использовать VisualVM и выполнить некоторое профилирование кучи , чтобы увидеть, что на самом деле занимает вашу память.Это намного лучше, чем догадки, и вы можете быть удивлены результатом.

1 голос
/ 15 июля 2010

Я полагаю, что большая часть памяти тратится в результате использования большого количества ArrayLists. Они предназначены для динамического использования (добавления и удаления), поэтому они обычно имеют много неиспользуемых позиций. Если ваша матрица статична, рассмотрите возможность использования 2d массива вместо списка списков. В противном случае попытайтесь установить емкость ArrayList на некоторое оценочное значение вместо значения по умолчанию.

0 голосов
/ 15 июля 2010

Очевидно, что проблема не в самой Hashmap, поскольку в ней не более двух записей (ключи - это имена двух ваших серверов). Вам просто нужно обработать большой объем данных (2 x 12000 x 100 значений, если я правильно понял, плюс результат, который является «файлом Excel»). Это просто нужно немного памяти. Большие объекты - это два списка 2D-массивов. На карте есть только ссылки на эти структуры данных.

Обычно мне было бы все равно, я просто увеличивал максимальный размер кучи до 512M или даже 1G.

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