Тепловая карта с 10000 * 400 точками в Java - PullRequest
0 голосов
/ 10 августа 2011

Я хочу показать пользователям тепловую карту с 10000 * 400 плитками. Текущее состояние в моей программе таково, что у меня есть класс JComponent. В этом JComponent у меня есть экземпляры Image для плиток. Если у меня была матрица 300 * 300, программа использует от 800 до 1000 МБ оперативной памяти. Это слишком много.

Что я могу сделать еще или у кого-то есть элемент управления, который может показать такую ​​большую карту тепла?

Сегодня я протестировал JHeatChart, что создает BufferedImage. Там размер для матрицы 10000 * 400 меньше 400 МБ, но классу требуется более 15 минут для его создания. Это слишком долго.

Кто-нибудь имеет идеи или знает элемент управления, который может обрабатывать данные?

Ответы [ 5 ]

2 голосов
/ 10 августа 2011

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

Вот пример.

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 голосов
/ 10 августа 2011

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

1 голос
/ 10 августа 2011

Очевидно, что 10000 * 400 плиток - это слишком много для просмотра сразу. Вместо этого используйте шаблон fly-weight , чтобы визуализировать только плитки, видимые в области просмотра JScrollPane. JTable является примером.

1 голос
/ 10 августа 2011

В любом случае, когда вы его представите, пользователь никогда не сможет воспринимать четыре миллиона точек данных одновременно. Поэтому у вас никогда не должно быть четырех миллионов графических виджетов. Либо дисплей должен быть уменьшен, либо (при увеличении) вы должны отображать только подмножество всех плиток за раз. В любом случае вам придется сопоставить условные 4 000 000 с гораздо меньшим количеством графических виджетов и повторно использовать те, которые у вас уже есть.

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

1 голос
/ 10 августа 2011

Действительно ли плитка должна быть представлена ​​как изображение, или будет достаточно цветной рамки?

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

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

...