2

私は私を夢中にさせている問題を抱えています。CSV ファイル (openCSV を使用) からデータベースにデータをインポートするのですが、以前はサーバーからのダウンロード時間を含めて 3 ~ 5 秒程度で完了していました。CSV ファイルには 3035 のレコードがあります。解析をCSVから分離してテーブルに挿入しようとしましたが、役に立ちませんでした。

奇妙に聞こえるかもしれませんが、アプリケーション内で突然何かが変更され、このプロセスにはるかに長い時間がかかりました。

絞り込んだ後、テーブルへの挿入がSQLiteでは非常に遅いことがわかりました。過去数時間、古いコードに戻って何かが変更されたかどうかを確認しましたが、うまくいきませんでした。

同様の質問に出くわしましたが、その答えは私が行った InsertHelper の使用を示唆しています。インポート時間にまったく違いはありませんでした。現在、データの挿入には 60 秒かかりますが、以前は数秒しかかかりませんでした。

public void importFromCSV() 
{
    SQLiteDatabase db = this.getReadableDatabase();
    db.execSQL("DELETE FROM EXAMS");
    File SDCardRoot = Environment.getExternalStorageDirectory();
    File file = new File(SDCardRoot.getAbsolutePath() + "/Finals/Data/timetable.csv");
    CSVReader reader;
    int i = 0;
    try {
        reader = new CSVReader(new FileReader(file));
        String [] nextLine;
        while ((nextLine = reader.readNext()) != null) {                
            this.addExam(new Exam(nextLine[0],
                                  nextLine[1],
                                  nextLine[2],
                                  nextLine[3],
                                  nextLine[4],
                                  nextLine[5],
                                  nextLine[6],
                                  nextLine[7],
                                  nextLine[8],
                                  nextLine[9]));
        }           

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }



}

public void addExam(Exam exam) {
    SQLiteDatabase db = this.getReadableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_SESSION, exam.getSession());
    values.put(KEY_AWARDING_BODY, exam.getAwardingBody());
    values.put(KEY_QUALIFICATION, exam.getQualification());
    values.put(KEY_TITLE, exam.getTitle());
    values.put(KEY_EXAM_CODE, exam.getExamCode());
    values.put(KEY_DURATION, exam.getDuration());
    values.put(KEY_DATE, exam.getDate());
    values.put(KEY_START_TIME, exam.getStartTime());
    values.put(KEY_EXAM_NOTE, exam.getExamNote());
    values.put(KEY_MY_NOTES, exam.getMyNotes()); 
    db.insert(TABLE_NAME, null, values);

}
4

1 に答える 1

4

挿入ごとに参照を設定する必要があるため、挿入が遅くなる可能性があります。Jeff Sharkeyは、実際にはGoogle IO 1012でこの問題について詳しく話しました。https: //developers.google.com/events/io/sessions/gooio2012/103/基本的に、すべてをできるだけ少ないトランザクションでまとめる必要があります。

try{
  db.beginTransaction();
  for each record in the list {
     do_some_processing();
     if (line represent a valid  entry) {
        db.insert(SOME_TABLE, null, SOME_VALUE);
     }
     some_other_processing();
  }
  db.setTransactionSuccessful();
} catch (SQLException e) {
} finally {
  db.endTranscation();
}
于 2012-07-22T15:37:56.780 に答える