2014-04-26 3 views
0

.txt 파일의 데이터를 분석 한 다음 데이터베이스에 기록하려고합니다. 나는 한 마디가 있어야하고 그것은 연속으로 첫 글자입니다. 저는 여기에 텍스트 파일로 작업하는 방법입니다안드로이드에서 .txt의 데이터를 처리하고 SQLite에 쓰는 속도를 높이려면 어떻게해야합니까?

private String convertStreamToString(InputStream is) 
     throws UnsupportedEncodingException { 

    StringBuilder stringBuilder = new StringBuilder(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    String line; 
    try { 
     while (true) { 
      line = reader.readLine(); 
      if (line == null) { 
       break; 
      } 
      allCities = stringBuilder.append(line).toString(); 
     } 
    } catch (IOException e) { 
     Log.e("error", e.getMessage()); 
    } 
    return allCities; 
} 


private String getAllWordsString() throws IOException { 

    AssetManager am = context.getAssets(); 
    InputStream is = am.open(Constants.FILE_NAME); 
    allWords = convertStreamToString(is); 
    is.close(); 

    return allWords; 
} 

을 그리고 여기가 databate에 기록하는 방법입니다

public void inputDBFeed(MyWord model) { 
    ContentValues cv = new ContentValues(); 
    cv.put(Constants.COLUMN_NAME, model.getName()); 
    cv.put(Constants.COLUMN_FIRST_LETTER, model.getFirstLetter()); 
    database.insert(Constants.MAIN_DB_NAME, null, cv); 
} 

public void prepareDBFeed() { 

    try { 
     allWords = this.getAllWordsString(); 
    } catch (IOException e) { 
     Log.e("Error:", e.getMessage()); 
    } 

    String[] cities = allWords.split(" "); 
    for (String oneWord : words) { 
     App.getDBManager().inputDBFeed(new Word(oneWord, getFirstLetter(oneWord))); 
    } 

} 

그러나 장치에서이 프로세스를 실행하면 2 ~ 5 분에 걸립니다. 가능한 한 많이 할 수있는 방법을 제공해주세요.

+0

은 적어도 최적화의 몇 만들 수 있습니다 : 1 - 대신의 BufferedReader의되는 FileChannel을 사용 http://naryad.wordpress.com/2012/03/16/largy-file-copying-bufferedreader- vs-scanner /. 2 - 트랜잭션 사용은 더 빠를뿐만 아니라 더 안전합니다 (모든 데이터가 삽입되거나 없음). –

답변

1
  1. 코드를 프로파일하여 시간이 실제로 소비 된 곳과 변경 사항이 실제로 도움이되는지 확인하십시오.

  2. 각 삽입시 디스크 I/O를 기다리지 않으려면 데이터베이스 트랜잭션에서 수백 개의 삽입을 감싸십시오.

  3. 동일한 SQL을 반복해서 다시 컴파일하지 않으려면 준비된 SQL 문을 사용하십시오.

  4. 각 반복에 대해 StringBuilder을 문자열로 변환하지 마십시오. 루프 이후에만 값이 필요합니다.

  5. 가능할 때마다 allocs 및 캐싱 값을 피할 수있는 것과 같은 몇 가지 다른 미세 최적화가있을 수 있습니다.

+0

6. BufferedReader 대신 FileChannel을 사용하십시오. –

관련 문제