Ну, я думаю, мне следовало задать этот вопрос, прежде чем приступать к разработке моего приложения для 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!
Итак, теперь, когда мы знаем, что моя проблема, вот мои вопросы:
- (самое главное) Как плохо привычка к карте ВСЕХ строки из базы данных к объектам и сохранить его в ОЗУ? Я чувствую, что это нехорошо, но, с другой стороны, возможно, мой пользовательский интерфейс будет использовать больше оперативной памяти, чем эти объекты.
- Мои расчеты более или менее точны? Мой объект занимает столько же памяти, сколько все поля, или я чего-то не хватает?
- Скажем, у меня есть эта тысяча объектов. Они используют некоторую память. Я положил их на карту. Я использую в два раза больше памяти, которую я использовал раньше, или я просто храню 1000 * 32/64-битные ссылки на карте?