2013-02-01 3 views
0

엔지니어링 업계를 위해 Android에 카탈로그 애플리케이션이 있습니다. Android 기기에 300,000 개가 넘는 디자인 이미지가 업로드되었습니다. 200 개가 넘는 새로운 이미지가 매일 기기에 동기화됩니다.수백 개의 이미지를 그리드에로드하는 동안 안드로이드 애플리케이션의 성능 문제가 발생했습니다.

디자인의 세부 사항이 저장되는 CatalogDetail 테이블이 있습니다. 서로 다른 속성과 두 개의 이미지 경로를 저장하기 위해 약 20 개의 열이 있습니다. 하나는 썸네일 용이고 다른 하나는 큰 이미지 용입니다. 썸네일 이미지의 평균 크기는 약 20KB이고 큰 이미지의 크기는 약 40KB입니다. 그리고이 모든 이미지는 데이터베이스가 아닌 동일한 폴더에 저장됩니다. 30 만 이미지의 전체 크기는 약 6GB입니다. 다양한 검색 조건에 따라 축소판 이미지와 간단한 설명이 응용 프로그램의 격자에 표시됩니다.

폴더에 5000 개의 이미지가있는 경우 응용 프로그램이 제대로 작동하고 데이터 크기가 커질수록 응용 프로그램의 속도가 느려지고 느려집니다. 현재 300,000 개의 이미지를로드 한 후 250 개의 이미지 (최종 사용자가 적어도 250 개의 이미지를 한 번에로드해야 함)를 그리드에로드하면 그리드로로드하는 속도가 비교적 느려지지만 스크롤하려고하면 상당히 많은 시간이 걸릴 것입니다. 장시간 (약 10-15 초), 바람직하지 않습니다.

SQL을 프로파일 링하여 SQL에 데이터를 가져 오는 데 상당한 시간 (1 초 미만)이 걸리지 않는다는 것을 알아 냈습니다. 마지막으로 폴더에서 이미지를로드하는 중 문제가 있음을 알아 냈습니다. 이미지는 내부 메모리에 저장됩니다. 이 응용 프로그램은 Android 3.1 (Honeycomb) OS, RAM 1GB 및 16GB 내부 메모리가있는 Samsung Galaxy Tab 750 10.1 인치에서 작동합니다. 응용 프로그램은 SDK 10을 사용하여 개발됩니다. 최종 사용자의 기본 요구 사항 중 하나는 디자인 이미지가 독점적이며 장치에서 복사해야한다는 것입니다. 따라서 이미지 폴더는 숨겨져 있으며 응용 프로그램 외부에서 액세스 할 수 없습니다.

어떻게 성능을 향상시킬 수 있는지 알려주십시오.
1. 이미지 색인이 있으면 성능이 향상 될 수 있습니까? 색인을 생성 할 수 있습니까? (소프트웨어, 응용 프로그램 등이 있습니까?
) 2. 각 폴더에 1000 개의 이미지를 저장하고 300 개의 폴더를 만들고 이미지에서 액세스 할 수 있다면 성능을 향상시킬 수 있습니까? ?하지만이 방법은 모든 이미지를 다시로드하고 테이블의 이미지 위치를 수정해야하므로 마지막 옵션이되어야합니다.
3. 스레딩 도움말이 있습니까? (스레딩을 모른다는 사실을 잘 알고 있습니다)

친절하게 내가 성능을 개선 할 수있는 방법을 나에게 제안
감사를 도와

검색 기능이 방법을 실행합니다 :..

,
private void ShowData() { 
    try { 
     Cursor countc = dal.getCursor("Select count(*) From Product " + whereCondition); 
     SQL = "Select ID as _id, Name, Code, ProductWeight, '" + fileLoc + "' || ImageLoc as ImageLoc, ReleaseDate From CatalogDetail " + whereCondition; 
     Cursor c = dal.getCursor(SQL + " Order By " + orderByField + " " + OrderSeq); 

     ProductGridView.setAdapter(new CatalogueListAdapter(this, c)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

는이 카탈로그는 그리드에로드되는 방법입니다

자발적으로 그 경우 단순히 자신의 이름을 기준으로 하위 폴더에 사진을 배포하거나하는 것입니다 내 마음에 오는
public class CatalogueListAdapter extends SimpleCursorAdapter { 
    private Context context; 
    private Cursor c; 

    public CatalogueListAdapter(Context context, Cursor c) { 
     super(context, R.layout.thumbnail, c, new String[] {}, new int[] {}); 
     this.context = context; 
     this.c = c; 
    } 
    @Override 
    public View getView(int position, View inView, ViewGroup parent) { 
     View v = inView; 
     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.thumbnail, null); 
     } 
     c.moveToPosition(position); 

     ImageView ivThumb = (ImageView) v.findViewById(R.id.thumbnail); 
     String imageLoc = this.c.getString(this.c.getColumnIndex("ImageLoc")); 
     if (imageLoc != null) 
      ivThumb.setImageURI(Uri.parse(imageLoc)); 
     return v; 
    } 
} 

답변

0

한 가지 그 (것)들을 위해 적당한 이름을주는 것은 가능하지 않다.

일반적으로 open() 호출은 디렉토리라는 특수 파일을 스캔해야합니다. 항목이 많으면이 선형 주행이 매우 느려질 수 있습니다.

내 의견은 "하이브리드"접근 방식을 좋아하지만 "인덱싱"과 조금 다릅니다. Bubble Sort는 오버 헤드가 적기 때문에 항상 몇 가지 항목에서 가장 빠르기 때문에 디렉토리에도 비슷한 규칙이 적용됩니다.

이미지가 파일 이름 또는 파일 이름의 해시 값으로 배포 될 수있는 경우 하위 구조 구조를 사용하여 이미지를 배치 할 수 있습니다. 물론 균등 분배가 기본 목표가되어야하므로 이름 또는 해시 함수를 현명하게 선택하십시오.

는 suimmarize 없습니다 :

  1. 예와 아니오; 위의 텍스트를 참조하십시오. ;)
  2. 그래, 나는 그 문제가 정말로 open()이라는 내 가정이 정확하다면 추가 색인만으로 도움이되지 않기 때문에 선호 할 것이다.
  3. 내 가정이 맞으면 스레딩이 도움이되지 않습니다.
+0

@ Stack Stacker에게 감사드립니다. 나는 에뮬레이터에서 테스트 할 것을 찾고있다. :) – Nagesh

+0

@Nagesh 어쩌면 성능을 죽이는 'open()'인지를 먼저 알 수 있지만, 느리게 움직일 확률은 거의 같다. –

+0

open()을 사용하지 않고 게시물에 코드를 추가하고 편집했습니다. 그것을 확인하십시오. – Nagesh

관련 문제