Здравствуйте! По совету из прошлого вопроса я не стал записывать нулевые ячейки в базу, теперь объём записываемых данных уменьшился с 25 165 824 до 6 881 280. Вопрос: можно ли ещё как-нибудь ускорить сохранение (сейчас оно занимает 140 секунд, хотелось бы сократить это время хотя бы до минуты) этих данных в базу?
Вот мой код сохранения:
void save()
{
final SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(path, null);
String sql_w_table =
"CREATE TABLE w_data (" +
"a LONG," +
"b LONG," +
"type LONG" +
");";
database.execSQL(sql_w_table);
String query = "INSERT INTO w_data VALUES (?,?,?);";
SQLiteStatement st = database.compileStatement(query);
database.beginTransaction();
for (int i = 0; i <= 32767; i++)
{
for (int n=0; n <= 255; n++)
{
int b = map[i][n];
if (b != 0)
{
st.bindLong(1, i);
st.bindLong(2, n);
st.bindLong(3, b);
st.executeInsert();
st.clearBindings();
}
}
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
}
Ответ
Предлагаю самый наивный способ - не сохранять "поячеечно", а "построчно". Попробую на коленке переписать (!!).
void save()
{
final SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(path, null);
String sql_w_table =
"CREATE TABLE w_data (" +
"a LONG," +
"type TEXT" +
");";
database.execSQL(sql_w_table);
String query = "INSERT INTO w_data VALUES (?,?);";
SQLiteStatement st = database.compileStatement(query);
database.beginTransaction();
for (int i = 0; i <= 32767; i++)
{
String s = '';
for (int n=0; n <= 255; n++)
{
s += map[i][n] + " ";
}
st.bindLong(1, i);
st.bindLong(2, s);
st.executeInsert();
st.clearBindings();
}
database.setTransactionSuccessful();
database.endTransaction();
database.close();
}
суть - в базу сохраняем сразу по строке. Когда нужно будет распаковывать, то используем обычный метод split у строки.
Можно пойти дальше и использовать blob и сохранять строку в один подход. Андроидовская обвязка для blob умеет сохранять массив byte. Класс java.nio.IntBuffer и java.nio.ByteBuffer позволяют завернуть массив int в массив byte. Вот пример как сохраняют картинку в базу.
Но я верю, что сохранение в файл будет как минимум не медленнее (если только не сохранять поэлементно).
Комментариев нет:
Отправить комментарий