2014-12-06 2 views
1

Ну, я думаю, мне следовало задать этот вопрос, прежде чем приступать к разработке моего приложения для Android, но я верю, что с вашей помощью, ребята, я все еще могу сделать все правильно с моим проектом.

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

public class NodeBean { 
    private int nodeId; 
    private String nodeName; 
    private int nodeType; 
    private int scannedTotal; 
    private int scannedSinceLastSync; 
    // + getters and setters 
} 

public class ConnectionBean{ 
    private int connectionId; 
    private BigDecimal connectionWeight; 
    private NodeBean firstNode; 
    private NodeBean secondNode; 
    private boolean someFlag; 
    // + getters and setters 
} 

Поскольку у меня есть записи, отображенные на объекты, я буду хранить эти два вида объектов в коллекции (HashMap<Integer, NodeBean> для NodeBean, ArrayList<ConnectionBean> или массив для ConnectionBean). Затем я собираюсь использовать их, чтобы заполнить правильный граф с помощью JGraphT и искать кратчайший путь.
Разный подход, который мог бы избавить меня от некоторой ОЗУ (поскольку я создал бы только одну коллекцию вместо двух), это «получить все результаты из базы данных и при их сопоставлении с объектами, мгновенно помещать их в граф». Таким образом, мне не нужно было бы хранить ConnectionBean в коллекции, так как мне это действительно не нужно. Тем не менее, мне приходится иметь дело с большой коллекцией NodeBean.

Я попытался оценить, сколько памяти я бы использовал. Если мои расчеты корректируется, мой NodeBean будет использовать около 25B (4 * 32 бита (4 int полеев) + ~ 72-80 бит (String поля, содержащего около 10-15 символов, формула взяты из here) и моего ConnectionBean бы использовать о 75-80B (4B для int + ~ 4 для BigDecimal (шаблона из here) + 2 * 64 бита (для NodeBean ссылок) + 64 бит (для boolean - взято из here) подразумевая меня есть 64-битный VM).

В начале, когда я начал разработку, хотя я ould имеют около 400-500 NodeBean с и около 750-1000 ConnectionBean с. Таким образом, я бы не использовал даже 100 КБ (25B * 500 + 80B * 1000 = 92.5kB) памяти (при условии, что мои вычисления прекрасны). Однако мое приложение должно быть масштабируемым, поэтому я предполагаю, что у меня могут быть даже 10k Nodes и 20k Connections - но даже в случае этого довольно большого графика это совсем не похоже на то, что это даже не 2MB!


Итак, теперь, когда мы знаем, что моя проблема, вот мои вопросы:

  1. (самое главное) Как плохо привычка к карте ВСЕХ строки из базы данных к объектам и сохранить его в ОЗУ? Я чувствую, что это нехорошо, но, с другой стороны, возможно, мой пользовательский интерфейс будет использовать больше оперативной памяти, чем эти объекты.
  2. Мои расчеты более или менее точны? Мой объект занимает столько же памяти, сколько все поля, или я чего-то не хватает?
  3. Скажем, у меня есть эта тысяча объектов. Они используют некоторую память. Я положил их на карту. Я использую в два раза больше памяти, которую я использовал раньше, или я просто храню 1000 * 32/64-битные ссылки на карте?

ответ

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

  2. Сложно рассчитать объем используемой памяти. Лучше всего попробовать это, и посмотреть, как он на самом деле ведет себя.

  3. Хранение предметов на карте не дублирует их объем памяти. Однако это больше, чем просто ссылка - вы добавляете накладные расходы Map.Entry для каждого из них. Повторите попытку и профайлы, чтобы посмотреть, как он себя ведет. Попробуйте худший случай.

Смежные вопросы