2011-08-10 2 views
0

히트 맵을 10000 * 400 타일로 보여주고 싶습니다. 내 프로그램의 현재 상태는 내가 JComponent 인 수업을 가지고 있다는 것입니다. 이 JComponent에는 타일에 대해 Image의 인스턴스가 있습니다. 300 * 300 매트릭스가 있다면이 프로그램은 800 ~ 1000MB 램을 사용합니다. 너무 많아.자바에서 10000 * 400 포인트가있는 히트 맵

다른 히트 맵을 표시 할 수있는 컨트롤이 있습니까?

오늘은 JHeatChart을 테스트하여 BufferedImage을 생성합니다. 10000 * 400 매트릭스의 크기는 400MB 미만이지만 클래스는이를 만들기 위해 15 분 이상이 필요합니다. 너무 깁니다.

데이터를 처리 할 수있는 컨트롤을 가진 사람이 있습니까?

+0

새 타일을 만들 때마다 이미지를로드합니까? 메모리 사용량은 정말 높습니다. 타일 ​​생성에 관련 코드를 게시 할 수 있습니다. – Sean

답변

2

지도이기 때문에 각 타일에 대해 구성 요소를 만들 필요가 없습니다. 그 중 많은 부분을 다시 사용할 수 있습니다. 당신이하고 싶은 것은 앱의 초기화 중에 모든 가능한 컴포넌트의 맵을 생성 한 다음, 각 타일에 그 컴포넌트에 대한 참조를 전달하는 것입니다.

여기에 예제가 있습니다.

public class HeatMap{ 

private static List<JComponent> tiles = new ArrayList<JComponent>();  
private List<JComponent> heatmap = new ArrayList<JComponent>(); 
private Random rand = new Random(); 

static{ 
    tiles.add(new JLabel("Cold")); 
    tiles.add(new JLabel("Hot")); 
    tiles.add(new JLabel("Warm")); 
} 

public HeatMap(){ 
    for(int i=0; i<10000; i++){ 
     for(int j=0; j<400; j++){ 
       heatmap.add(tiles.get(rand.nextInt(3)));    
     } 
    } 
} 
} 

위의 경우에 우리는 3 개의 타일을 생성해야하고, 나머지는 그 참조를 참조해야합니다. 이러한 유형의 접근 방식은 메모리 사용량을 줄이는 데 도움이됩니다.

2

지도 크기 조정을 시도해 볼 수 있습니다. 따라서 모든 단일 타일을 화면에 뿌려주는 대신 멀리서 확대 한 경우 더 큰 타일을 사용하십시오. 모든 단일 타일에 대한 참조를 유지하는 대신 하나의 객체에 단일 타일을 병합하려고 할 수도 있습니다.

1

실제로 타일을 이미지로 나타내야하거나 색상 상자로 충분합니까?

색칠 된 상자로 충분하면 paint(...) 방법으로 보이는 타일을 그릴 수 있습니다. 이미지를로드 할 필요가 없습니다.

이미지가 있어야하는 경우 모든 타일이 고유하지는 않으므로 타일 당 이미지를로드하는 대신 필요한 모든 이미지를 한 번로드하고 해당 이미지를 타일로 참조하십시오. 따라서 100 개의 서로 다른 이미지가있는 경우 4000000 개의 사본 대신 1000000000000 개의 매우 작은 참조가 있어야합니다.

1

어떤 방식 으로든 표시하면 사용자는 4 백만 데이터 포인트를 동시에 인식 할 수 없습니다. 따라서 그래픽 위젯이 4 백만 가지가되지 않아야합니다. 디스플레이 크기를 줄이거 나 (확대 한 경우) 한 번에 모든 타일의 하위 집합 만 표시해야합니다. 어쨌든 당신은 4,000,000이라는 명목상의 그래픽 위젯에 매핑하고 기존의 그래픽 위젯을 재사용해야합니다.

다른 답변이 지정되면 작업을 수행 할 수있는 가장 간단한 가능한 위젯 유형을 사용해야합니다.

1

당연히 10000 * 400 타일이 너무 많아 한 번에 볼 수 없습니다. 대신 fly-weight pattern을 사용하여 JScrollPane의 뷰포트에 표시되는 타일 만 렌더링하십시오. JTable이 그 예입니다.

관련 문제