我可能只是遇到了SQLite的本机性能问题,但是即使使用事务处理和预编译的语句,插入SQLite似乎也存在相当大的开销。也许我使用不正确。
我需要逐行(通过URL)读取文件并创建行。该机制是通用的,因此可以(在合理的范围内)创建任何表并添加任意数量的行。我看到较大的刀片具有相当不错的性能,但较小的刀片似乎至少需要+ 400ms的时间。由于我可能要加载其中的100多个,因此较小的开销导致了较长的加载时间。
例如一些时间安排
34 records Test #1 ----> 490 ms
36238 records Test #2 ----> 3021 ms
4 records Test #3 ----> 520 ms
这是代码(我剪掉了所有的try / catches和其他代码,将其简化为实际的插入代码):
InputStream input = new BufferedInputStream(url.openStream());
// Create the file reader
BufferedReader br = new BufferedReader(new InputStreamReader(input, "UTF-8"));
StringBuffer insertSql = null;
// Build the SQL to bind
insertSql = new StringBuffer("INSERT INTO " + fileName + " (");
String sep = "";
insertSql.append("[" + getDbColumnNames().replaceAll(" ", "").replaceAll(",", "],[") + "]");
String[] columns = getDbColumnNames().split(",");
insertSql.append(") VALUES (");
for (@SuppressWarnings("unused") String col : columns) {
insertSql.append(sep.trim() + "?");
sep = ",";
}
insertSql.append(");");
this.open();
sqlDB.beginTransaction();
SQLiteStatement stmt = = sqlDB.compileStatement(insertSql.toString());
String line = "";
// Read the file line by line
while ((line = br.readLine()) != null) {
String[] tokens = line.split(",");
// Build the bindings and insert the data
int bindcnt = 1;
for (String token : tokens) {
stmt.bindString(bindcnt++, token.trim());
}
long entryID = stmt.executeInsert();
if (entryID < 0) {
success = false;
}
stmt.clearBindings();
}
sqlDB.setTransactionSuccessful();
sqlDB.endTransaction();
我已经证实,对于大多数读取来说,读取缓冲区的开销并不重要。