速度差异极大,从文件(快)或变量 List 读取每一行<String>(非常慢)



我创建了2个不同的函数来做同样的事情:

逐行读取并将值插入数据库。

第一个(更快(从 csv 文件中读取信息;

load_voc(database, new InputStreamReader(myContext.getAssets().open(file_csv_vocaboli)));
private void load_voc(SQLiteDatabase db, InputStreamReader in ) {
    BufferedReader reader = new BufferedReader(in);
    try {
        String line = null;
        //Legge la riga del CSV e la inserisce nella tabella tramite il metodo  getContentValues della classe Voc definita in fondo alla pagina
        int i=0;
        while ( (line = reader.readLine()) != null ) {
            db.insert(Voc.TABLE_NAME, null, Voc.getContentValues(line));
            Log.i(TAG_i,"test: "+i);
            i++;
        }
        reader.close();
    }
}

第二个(非常慢(从变量列表中获取信息;

 private void load_voc_agg( List<String> csv_file_list_voc ) {
        String line = null;
        for(int i=0;i<csv_file_list_voc.size();i++){
            database.insert(Voc.TABLE_NAME, null, 
            Voc.getContentValues(csv_file_list_voc.get(i)));
            Log.i(TAG_i,"test: "+i);
        }
}

我也尝试过

for(String s: csv_file_list_voc) {}

 Iterator<String> iterator = csv_file_list_voc.iterator();
 while(iterator.hasNext()) {}

结果相同。

我以为这是第二种方法最快,但它慢了 20 倍!

有什么建议吗?

谢谢。

您需要使用事务进行多次插入以获得更快的速度。应该是这样的:

private void load_voc_agg( List<String> csv_file_list_voc ) {
  String line = null;
  database.beginTransaction();
  for(int i=0;i<csv_file_list_voc.size();i++){
    database.insert(Voc.TABLE_NAME, null, 
    Voc.getContentValues(csv_file_list_voc.get(i)));
    Log.i(TAG_i,"test: "+i);
  }
  database.setTransactionSuccessful();
  database.endTransaction();
}

或者你可以将SQLiteStatement与事务一起使用:

private void load_voc_agg( List<String> csv_file_list_voc ) {
  String line = null;
  database.beginTransaction();
  String sql = "insert into" + Voc.TABLE_NAME + " (col1, col2) values (?, ?);";
  database.beginTransaction();
  SQLiteStatement statement = database.compileStatement(sql);
  for(int i=0;i<csv_file_list_voc.size();i++){
    // Create your insert 
    statement.bindString(1, val1);
    statement.bindString(2, val2);
    long rowId = stmt.executeInsert();
    stmt.clearBindings();
  }
  database.setTransactionSuccessful();
  database.endTransaction();
}

最新更新