Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从SD卡读取数据并插入SQL表的速度非常慢_Android_Performance_Sqlite_Insert_Opencsv - Fatal编程技术网

Android 从SD卡读取数据并插入SQL表的速度非常慢

Android 从SD卡读取数据并插入SQL表的速度非常慢,android,performance,sqlite,insert,opencsv,Android,Performance,Sqlite,Insert,Opencsv,我有一个让我发疯的问题,我希望你们能给我一些想法。我使用openCSV将CSV文件中的数据导入到数据库中,在此之前,这个过程大约在3-5秒内完成,包括从服务器下载的时间。CSV文件有3035条记录。我尝试将解析与CSV分离并插入到表中,但没有效果 听起来很奇怪,我的应用程序中突然发生了一些变化,现在这个过程需要更长的时间 缩小范围后,我发现对于SQLite,插入到表中的速度非常慢。在过去的几个小时里,我一直在返回到旧代码,看看是否有什么东西发生了变化,但没有运气 我遇到了一些类似的问题,其答案建

我有一个让我发疯的问题,我希望你们能给我一些想法。我使用openCSV将CSV文件中的数据导入到数据库中,在此之前,这个过程大约在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);

}

您的插入可能很慢,因为您必须为每个插入设置引用。杰夫·沙基(Jeff Sharkey)实际上刚刚在谷歌IO 1012上详细讨论了这个问题。基本上,您应该尽可能少地将所有事务打包

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();
}

您的插入可能很慢,因为您必须为每个插入设置引用。杰夫·沙基(Jeff Sharkey)实际上刚刚在谷歌IO 1012上详细讨论了这个问题。基本上,您应该尽可能少地将所有事务打包

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();
}

你在设备上测试过吗?你试过别的吗?您发布的代码是关于读取文件,而不是插入SQL。也许张贴插入片段会更好?我认为这可能与阅读SD有关。如果SD卡上几乎没有空间,它就会变慢。你对此做过分析而不是猜测吗?您应该使用systrace工具,并尝试找出您的瓶颈所在。我在One X和HD2上都尝试过,同样的情况也发生在emulator上。addExam方法将其插入数据库。因此,当它从CSV文件中读取时,它会立即输入。您是否在设备上测试它?你试过别的吗?您发布的代码是关于读取文件,而不是插入SQL。也许张贴插入片段会更好?我认为这可能与阅读SD有关。如果SD卡上几乎没有空间,它就会变慢。你对此做过分析而不是猜测吗?您应该使用systrace工具,并尝试找出您的瓶颈所在。我在One X和HD2上都尝试过,同样的情况也发生在emulator上。addExam方法将其插入数据库。因此,当它从CSV文件中读取时,它会立即输入。是的!这很有效。它在2秒内完成工作,而不是60秒以上。谢谢,谢谢。不。问题谢谢你的投票并接受。让我帮更多的忙:是的!这很有效。它在2秒内完成工作,而不是60秒以上。谢谢,谢谢。不。问题谢谢你的投票并接受。让我帮了更多的忙: