1

現在、解析する CSV ファイルがあり、データを Android データベースに挿入しようとしています。私が抱えている問題は、すべてのデータを挿入するのに時間がかかりすぎることです。かなりの量のデータですが、完了するのに20分もかからないように感じます.

基本的に、データベースを作成してから解析を開始します。個々の CSV 行を解析しながら、必要なデータを取得してデータベースに挿入します。合計で約 40000 行あります。

このプロセスをスピードアップする方法はありますか? バッチ挿入を試しましたが、実際には役に立ちませんでした (間違っていない限り)。

以下のコード。

ありがとう。

DatabaseHelper (各 csv 行のデータ量に基づいて 2 つの挿入コマンドがあります):

// add zipcode
    public void add9Zipcode(String zip, String city, String state, String lat,
            String longi, String decom) {

        // get db and content values
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        db.beginTransaction();
        try{

            // add the values
            values.put(KEY_ZIP, zip);
            values.put(KEY_STATE, state);
            values.put(KEY_CITY, city);
            values.put(KEY_LAT, lat);
            values.put(KEY_LONG, longi);
            values.put(KEY_DECOM, decom);

            // execute the statement
            db.insert(TABLE_NAME, null, values);

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }

        db.close();

    }

    public void add12Zipcode(String zip, String city, String state, String lat,
            String longi, String decom, String tax, String pop, String wages) {

        // get db and content values
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        db.beginTransaction();
        try{
            // add the values
            values.put(KEY_ZIP, zip);
            values.put(KEY_STATE, state);
            values.put(KEY_CITY, city);
            values.put(KEY_LAT, lat);
            values.put(KEY_LONG, longi);
            values.put(KEY_DECOM, decom);
            values.put(KEY_TAX, tax);
            values.put(KEY_POP, pop);
            values.put(KEY_WAGES, wages);

            // execute the statement
            db.insert(TABLE_NAME, null, values);

            db.setTransactionSuccessful();
        } finally{
            db.endTransaction();  
        }


        db.close();
}

解析ファイル:

public void parse(ArrayList<String> theArray, DatabaseHandler db) {

        String[] data = null;

        // while loop to get split the data into new lines
        // for loop to split each string in the array list of zipcodes
        for (int x = 0; x < theArray.size(); x++) {

            if(x == 10000 || x == 20000 || x == 30000 || x == 40000){
                Log.d(TAG, "x is 10k, 20k, 30k, 40k");
            }

            // split string first into an array
            data = theArray.get(x).split(",");

            // separate based on the size of the array: 9 or 12
            if (data.length == 9) {

                db.add9Zipcode(data[0], data[2], data[3], data[5], data[6],
                        data[8]);

            } else if (data.length == 12) {

                db.add12Zipcode(data[0], data[2], data[3], data[5], data[6],
                        data[8], data[9], data[10], data[11]);

                /*
                 * theZip.zip = data[0]; theZip.city = data[2]; theZip.state =
                 * data[3]; theZip.lat = data[5]; theZip.longi = data[6];
                 * theZip.decom = data[8]; theZip. = data[9]; theZip.population
                 * = data[10]; theZip.wages = data[11];
                 */

            }
        }
4

1 に答える 1

3

以前に作成したこの回答を参照してください:sqlite3データベースに1000000行を挿入する

つまり、を使用して、InsertHelperトランザクションごとに複数の挿入を実行します。何か不安定なことをしない限り、速度の向上は顕著になります。

編集:
要するに:

  1. SQLiteOpenHelperアプリケーション全体で使用されるシングルトンである必要があります。
  2. インスタンスを呼び出さないclose()でください。SQLiteDatabaseインスタンスはにキャッシュされ、SQLiteOpenHelper閉じるたびにヘルパーに再度開くように強制します。
  3. 挿入をバッチ処理し、メソッドの呼び出しの外部でトランザクションを開始し、addZipCodeすべての挿入が完了したら成功としてマークを付けます。次に、トランザクションをコミットします。
  4. -を使用しInsertHelperます。これにより、挿入が準備済みステートメントとして適切にフォーマットされ、再利用可能になります。
  5. データベースへのアクセスの同期に注意してください-UIスレッドですべてのデータベース作業を行う予定がない限り(これは推奨されません)-同時アクセスを回避するために、データベースへのロックを有効にするか、アクセスを保護する必要があります。
于 2012-05-27T08:16:40.547 に答える