|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
Здравствуйте! У меня в приложении есть БД SQLite, при нажатие на кнопку загрузки, приложение начинает в базу вносить записи. Структура базы : 1.таблица-одна, колонка - одна 2.Кол-во записей : 20 000 3.Формат записи: String до 10 символов. Метод добавления : через бэкграунд, фоновый поток, используя наследования класса "AsyncTask" Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
При занесения записей в базу, уходит около 10-20 минут. Подскажите пожалуйста, нормальная ли это ситуация, когда так долго происходит добавления записей в БД? Я понимаю что в фоновом потоке задачи выполняются медленнее. Но всё таки, мне кажется что то слишком долго. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 14:46 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
не нормально. 1) стартовать транзакцию до начала вставки, коммитить либо совсем в конце, либо каждые несколько тысяч записей (в конце или нет, зависит от задачи - т.е. устраивает, что вставится 4000 записей а потом по ошибке отвалится или нет) 2) используй InsertHelper или SQLiteStatement ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 14:55 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
Вставлять нужно порциями... Перед началом вставки порции явно открой транзакцию и затем явно закрой. Порции подбираются опытным путем. Я обычно делаю 1000. Проблема в том, что без этого транзакции стартуют и заканчиваются на каждый чих (вставку). Ну и вставлять лучше через SQLiteStatement , а не через ContentValues. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 14:55 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
chpashaне нормально. 1) стартовать транзакцию до начала вставки, коммитить либо совсем в конце, либо каждые несколько тысяч записей (в конце или нет, зависит от задачи - т.е. устраивает, что вставится 4000 записей а потом по ошибке отвалится или нет) 2) используй InsertHelper или SQLiteStatement Хм... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 14:56 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
wadmanХм... это называется на кнопке обошел :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 15:00 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
Использованием общей транзакции ты увеличишь скорость вставки раза в 2. Кури PRAGMA synchronous = 0 | OFF | 1 | NORMAL | 2 | FULL; Этот сервак по умолчанию стоит в FULL - т.е. записывает КАЖДОЕ изменение на диск без кэширования, что и тормозит загрузку. Перед массовой заливкой нужно передать PRAGMA synchronous OFF, после заливки "вернуть все на место". Вот тогда база SQLite летает - я когда-то грузил в нее несколько тысяч записей в секунду. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 16:15 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
Микола ПитерскийВот тогда база SQLite летает - я когда-то грузил в нее несколько тысяч записей в секунду. На средненьком смартфоне? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 16:57 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
wadman, УХХХ!!Ты!!! Спасибо! Скорость возросла в ДЕСЯТКИ РАЗ!!!! с 15-20 минут до 25 секунд!!! Использовал транзактицию. Еще сделаю метод добавления информации в базу данных, через SQLiteStatement, посмотрим насколько еще возрастет скорость. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 17:01 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
НикоДимиденУХХХ!!Ты!!! Спасибо! А я-то что? chpasha был быстрее меня. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 17:05 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
wadman, Да всем спасибо, кто откликнулся! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 17:13 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
С использованием класса SQLiteStatement, стало работать ещё быстрее почти в два раза. Вместо 24 секунд, 13 =) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 21:50 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
Микола Питерский, Вы это делали? SQLiteDatabase.execSQL(“PRAGMA synchronous=OFF”); Изменить способ записи в базу – без “синхронизации”. При выключении данной опции, база данных может быть повреждена при неожиданном сбое системы, либо отключении питания. Однако согласно документации SQLite некоторые операции при выключении данной опции выполняются более чем в 50 раз быстрее. Это довольно опасно, как по мне. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 22:53 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
По вашим рекомендациям я разделил добавления информации на некие ячейки, и теперь я добавляю не по одной записи а по 100. Скорость выросла колоссально!!! Раньше загрузка длилась 15-20 минут, теперь 1,0 - 1,5 секунды. Я доволен) пример: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Кстати на заметку. Я прочитал что можно еще воспользоваться NDK и написать код на с++. Тогда будет еще быстрее. Может кому понадобится. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2015, 23:32 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
А не.. 7 секунд получилось. Только я видимо как то не правильно добавляю записи Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Что я делаю не правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2015, 00:02 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
НикоДимиден Код: java 1. 2.
Вторая строка замещает предыдущее значение. НикоДимиден Код: java 1.
Наверняка у нее есть текст. Правда, я не заметил разницы между тем примером, что с ошибкой и тем, когда не добавляются две записи... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2015, 09:21 |
|
AsyncTask SQLite
|
|||
---|---|---|---|
#18+
НикоДимиденМикола Питерский, Вы это делали? SQLiteDatabase.execSQL(“PRAGMA synchronous=OFF”); Изменить способ записи в базу – без “синхронизации”. При выключении данной опции, база данных может быть повреждена при неожиданном сбое системы, либо отключении питания. Однако согласно документации SQLite некоторые операции при выключении данной опции выполняются более чем в 50 раз быстрее. Это довольно опасно, как по мне. Ничего опасного - все сервера Кэшируют изменения в буффер и только потом записывают на диск этот буффер, а в SQLite буферизация отключена изначально. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2015, 09:30 |
|
|
start [/forum/topic.php?fid=13&fpage=18&tid=1331372]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
22ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 260ms |
total: | 372ms |
0 / 0 |