2014-12-06 3 views
1

글쎄, 안드로이드 애플리케이션 개발을 시작하기 전에이 질문을 던져야한다고 생각한다. 그러나 나는 당신의 도움으로 믿을 수있다.

내 프로젝트에서는 그래프에서 최단 경로를 찾아 보겠습니다. 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를 사용하여 적절한 그래프를 채우고 최단 경로를 찾으려면이 값을 사용합니다.
RAM을 아끼지 않는 다른 접근 방식 (두 개가 아닌 하나의 컬렉션 만 생성)은 "데이터베이스에서 모든 결과를 가져 와서 개체에 매핑하는 동안 즉시 그래프에 넣을"수 있습니다. 이렇게하면 컬렉션에 ConnectionBean을 저장할 필요가 없습니다. 실제로 필요하지는 않습니다. 그래도 큰 컬렉션 NodeBean s를 다뤄야합니다.

얼마나 많은 메모리를 사용했는지 추정하려고했습니다. 제 계산을 수정하는 경우, 내 NodeBean25B (4 * 32 비트 (4 개 int 필드) + ~ 72-80 비트 (10-15자를 함유 String 필드, 수식 here 찍은) 내 ConnectionBean 사용할 것을 사용 약 75-80B (boolean위한 NodeBean 참조 용 here에서 BigDecimal (패턴) + 2 * 64 비트() + 64 비트 (용 int + ~ 40B 용 4B - here 찍은) I 64 비트 VM을 의미).

처음에는 개발을 시작했을 때 ould는 약 400-500 NodeBean 및 약 750-1000 ConnectionBean을 갖는다. 이 방법은 100kB (25B * 500 + 80B * 1000 = 92.5kB)의 메모리도 사용하지 않을 것입니다 (내 계산이 좋다고 가정). 그러나, 심지어 10k 노드와 20k 연결까지도 가질 수 있다고 가정 할 수 있도록 응용 프로그램을 확장 할 수 있어야합니다. 그러나 꽤 큰 그래프의 경우에도 발생하는 것과는 꽤 다릅니다 - 2MB가 아닙니다!


그래서, 지금 우리가 내 문제가 무엇인지 알고, 여기 내 질문이 있습니다 :

  1. (가장 중요한 역할을) 어떻게 나쁜 습관은 객체 데이터베이스에서 ALL 행을 매핑하는 것이다 RAM에 보관 하시겠습니까? 내 직감이 좋지는 않지만 다른 한편으로는 아마 내 UI가 이러한 객체보다 RAM을 더 많이 사용하게 될 것입니다.
  2. 내 계산이 다소 정확합니까? 내 물건이 그 모든 분야만큼 많은 기억을 가지고 있습니까? 아니면 여기에 뭔가 빠져 있습니까?
  3. 내가 수천 개의 개체를 가지고 있다고 가정 해 보겠습니다. 그들은 약간의 기억을 사용합니다. 나는 그들을지도에 넣었다. 이전에 사용한 메모리의 약 2 배를 사용합니까, 아니면지도에 1000 * 32/64 비트 참조 만 저장합니까? 당신은 이미 알아 낸 것처럼 당신이 원하는 것보다 이렇게하면 더 많은 메모리를 사용할 경우

답변

0
  1. , 그것은 문제입니다. 항목 수의 상한선이 제어되는 경우 나쁘지는 않습니다. 앱을 크래시하지 않을 수도 있습니다.

  2. 사용되는 메모리 양을 계산하기가 어렵습니다. 할 수있는 가장 좋은 방법은 시도하고 실제로 어떻게 작동하는지 확인하는 것입니다.

  3. 지도에 항목을 저장해도 메모리 사용량이 중복되지 않습니다. 그러나 이것은 단순한 참조 이상입니다. 각 Map.Entry의 오버 헤드를 추가하는 것입니다. 다시 시도해보고 프로파일 링하여 작동 원리를 확인하십시오. 최악의 경우를 시도하십시오.

관련 문제