2010-07-15 3 views
0

내 프로젝트에서는 두 개의 서버에서 양식을 가져 와서 해시 맵에 보관합니다.그 밖에도 HashMap 대신 사용할 수있는 것은 무엇입니까?

키 서버 이름이며, 값이 2 차원의 ArrayList (ArrayList<ArrayList<Object>>)에서의 ArrayList

이고, I는 해당 서버의 형태에 속하는 필드의 값을 유지한다. 두 서버에서이 값을 비교하여이를 Excel 파일로 인쇄합니다.

내 문제는 내가 12000 항목과 100 개의 필드가있는 양식을 얻을 때이지도는 약 400M의 메모리를 사용합니다. 내 프로그램이이 많은 메모리를 사용하는 것을 원하지 않는다. 나 한테 뭐라고 제안 해 줄 수 있니?

답변

5

문제를 일으키는 해시 맵은 아닌데, 기본적으로 10 개 항목의 여유 공간을 할당하기 때문에 ArrayList가 의심 스럽습니다. 각 색인에 대해 하나 또는 두 개의 값만 저장하는 경우 이는 낭비입니다.

초기 크기를 1 또는 2로 설정하면 도움이되는지 확인할 수 있습니다. 잠재적 인 단점은 크기가 너무 작 으면 빈번한 재 할당이 발생한다는 것입니다. 그러나 그로 인해 심각한 속도 저하가 발생하면 자신을 볼 수 있습니다.

+0

좋은 답변입니다. 나는 그것에 대해 완전히 잊었다. – hvgotcodes

1

많은 ArrayLists를 사용하면 메모리 낭비가 많이 발생한다고 생각합니다. 그들은 동적 사용 (추가 & 제거)을 위해 설계되었으므로 대개 사용하지 않는 위치가 많이 있습니다. 행렬이 정적 인 경우 목록 목록 대신 2 차원 배열을 사용하는 것이 좋습니다. 그렇지 않으면 ArrayList의 용량을 기본값 대신 일부 예상 값으로 설정하십시오.

+0

사용되지 않은 ArrayList 슬롯은 목록에 포함 된 개체에 비해 크기가 중요하지 않으므로 거의 문제가되지 않습니다. –

+0

@ 마이클 : 나는 완전히 반대한다. 예를 들어, 10000 개의 맵 항목이 있고 각 항목에 1000 개의 용량 목록 목록이 저장되어 있으면 1G의 메모리를 "낭비"합니다. 어레이 목록의 배가율이 1.5라는 사실 때문에이 계산에서 25 %의 공실률을 가정합니다. 또한 과거에이 문제가 발생했음을 알려주고 배열로 해결했습니다. –

+1

낭비되지 않는 목록 슬롯이 3G를 차지하고 그 안에 들어있는 물체가 적어도 * 다른 7.5G –

2

HashMap은 전혀 문제가되지 않습니다. ArrayList<ArrayList<Object>>에 실제로 포함 된 개체는 무엇입니까?

실제로 VisualVM을 사용하고 실제로는 무엇이 메모리를 차지하는지 보려면 heap profiling을 수행해야합니다. 이것은 여기서 추측하는 것보다 훨씬 낫습니다. 결과에 놀랄 수 있습니다.

+0

+1 : 좋은 생각입니다. (여전히 ArrayList의 낭비 문제에 대한 귀하의 판단에 동의하지 않습니다) –

+0

개체는 문자열과 하나의 긴 숫자입니다. 나는 VisualVM을 시도하고 그 결과를 말할 것이다. – ilhan

0

문제는 분명히 Hashmap 자체가 아닙니다. 두 개 이상의 항목 (키는 두 개의 서버 이름 임)이 없기 때문입니다. 당신은 단지 많은 양의 데이터 (2 x 12000 x 100 값을 처리해야하는데, 결과에 '엑셀 파일'을 더한 값을 더하면). 단지 약간의 기억이 필요합니다. 큰 객체는 두 개의 2D 배열 목록입니다. 지도에는 이러한 데이터 구조에 대한 참조 만 있습니다.

보통 나는 최대 힙 크기를 512M 또는 1G로 늘릴 수 있습니다.

관련 문제