|
|
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
WalterSullivan1Сейчас пытаюсь распараллелить как советовал Blazkowicz . Это не я советовал. Я советовал выкинуть лишнее перекладывание байтов из потока в StringBuilder. А распаралеливание - спорное решение с точки зрения Андроида. Вычитка и парсинг будут намного опережать всавку данных. Поэтому резульаты парсинга могут накапливаться в памяти. Хотя 7-10 Мб должно быть не так много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 11:53:16 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
Попробуйте использовать множественную вставку вида Код: sql 1. (работает не для всех версий SQLite) подобрать оптимальное кол-во строк (я для андроида делал по 1000) В любом случае у вас должен быть прирост производительности с пакетом в 1000 записей при подготовленном запросе, чем вставка всех записей в одной транзакции. Распараллеливание imho только ухудшит ситуацию. (только для SQLite) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 13:50:16 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
WalterSullivan1, еще тут почитай http://www.sqlite.org/pragma.html#pragma_synchronous http://www.sqlite.org/pragma.html#pragma_journal_mode ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 14:01:21 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
TrogloditПопробуйте использовать множественную вставку вида Код: sql 1. Спасибо! Ваш вариант не заработал, но работает такой Код: sql 1. 2. 3. 4. 5. 6. Так как SQLite не принимает больше 999 параметров запроса, количество записей за одну вставку пришлось сократить до 249, но метод стал выполняться за 20 секунд. mayton , я пробовал отключать синхронизацию, выигрыша не получил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 11:04:54 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
Blazkowiczchabapokя бы сразу в стрнгбилдере конструировал групповой инсерт, прамо из входящих данных, и по достижении определенного размера - отправлял его на выполнение. Что это даст? Каждый новый SQL запрос будет парсится заново если значения заинлайнить. А разве есть способ избежать повторного парсинга? Помоему, такого способа нет. Если мы засовываем данные через PreparedStatement, то вставка идет по одной строке и накладные расходы процентов на 20 больше. Сэкономили на парсинге - проиграли в других местах. А если SSD? Андроид ведь.[/quot] судя по задаче, маловероятно. BlazkowiczНа самом деле вычитка пройдёт намного быстрее чем инсерты, поэтому не на что это особо не повлияет. Но есть смысл ограничить размер очереди, чтобы всё в памяти не держать, а заблокировать чтение на время, пока набор данных сбросится в базу. к сожалению (или к счастью) операционка начинает распараллеливать одновременный доступ к нескольким файлам, при определенных условиях seek-и головки все сьедают. И задача у топикстартера такая, что ему на эти условия очень легко нарваться. BlazkowiczSQLite же. Не замеитл :) Действительно. Ну, с SQLite все значительно проще. Какие головки? Какие потоки? Надо все инсерты сделать в одной транзакции. Будет около 1 секунды на его 50000 записях, скорей всего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 12:17:44 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
WalterSullivan1 Пробовал вместо одной транзакции на 50 000 делать 50 транзакций по 1000, тоже не быстрее. Учитывая ваш говнокод, я уверен, что вы действительно уменьшили кол-во транзакций. И к тому же, зачем давать 50 по 1000, сделайте одну по 50000. Там у sqlite есть, насколько помню, несколько режимов работы, один из них - когда базу можно юзать из независимых процессов. Он же самый медленный, и он по умолчанию, однако поиграться другими режимами, но все равно у sqlite основной кушатель времени - это закрывание транзакций. WalterSullivan1Сейчас пытаюсь распараллелить как советовал Blazkowicz . Я под андроид ничего не делал, однако навскидку я не могу назвать распараллеливание под андроидом хорошим решением. Распараллеливание полезно там, где железо имеет много ядер. Андроид, все же, не xeon, ядер как правило там мало, очень часто одно. И если вы наплодите десятки потоков - вы сделаете только хуже. Нормально - когда кол-во потоков чуть больше или равно кол-ву ядер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 12:41:16 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
Буферизировать можно. Правда данные не сразу будут доступны для чтения из БД но если такое допущение возможно то для оптимизации почему бы и нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 12:42:08 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
chabapokЯ под андроид ничего не делал, однако навскидку я не могу назвать распараллеливание под андроидом хорошим решением. Распараллеливание полезно там, где железо имеет много ядер. Андроид, все же, не xeon, ядер как правило там мало, очень часто одно. И если вы наплодите десятки потоков - вы сделаете только хуже. Нормально - когда кол-во потоков чуть больше или равно кол-ву ядер. Есть смысл отделить вставку в базу, так как она занимает кучу локального IO, от остального кода, который занимает CPU. Чтение ещё надо посмотреть откуда происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 12:43:28 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, 1. разве внутри драйвера SQLite такого отделения не сделано? 2. пусть он посчитает через System.currenttimeMillis() сколько у него суммарно длится выполнение внутри его инсерта. Как-то я не доверяю профайлеру, замечал что он не всегда корректно показывает. Если его значение получится близко к 100% от всего выполнения, то параллелить нет смысла, даже если движок БД это не делает. Как-то так: long t=0; ... long before = System.currenttimeMilles(); stmt.executeInseert() t = t+ (System.currenttimeMilles()-before); ... И вконце сравнить t с временем выполнения всей программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 13:02:44 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
На время вставки дропнул индексы, скорость выполнения упала до 11 секунд. Это меня устраивает, всем спасибо за предложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 13:28:40 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
WalterSullivan1На время вставки дропнул индексы, скорость выполнения упала до 11 секунд. Это меня устраивает, всем спасибо за предложения. мой мозг пасует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 14:39:31 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
WalterSullivan1На время вставки дропнул индексы, скорость выполнения упала до 11 секунд. Это меня устраивает, всем спасибо за предложения. не зря говорят, когда не заводится машина - попинай колесо, проверь бензин в баке))))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 14:44:05 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
В некоторых БД для загрузки делают т.н. специальные одноразовые таблицы. Они без индексов, констрейнтов и триггеров. Их задача просто принять данные из внешнего источника (loaders, etl-s). Далее какие-то бизнес процессы будут по расписанию подхватывать эти таблицы, чистить от грязных данных, обогащать и вливать в основную модель. Вопрос согласованности данных остаётся за кадром. Просто разработчик с аналитиком решают в какой момент данные становятся "видны" для модели в целом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 14:45:08 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
WalterSullivan1На время вставки дропнул индексы, скорость выполнения упала до 11 секунд. Это меня устраивает, всем спасибо за предложения. С 57 до 11 только из-за индексов? Сколько всего индексов в таблице? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 14:59:46 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
WalterSullivan1, подозреваю, что у вас там к тому же индексы сделаны неправильно. Очень часто (всегда) сталкивался, что люди ставят целую кучу лишних индексов, но при этом не ставят нужных. В результате у них база тормозит - а они начинают делать какие-нибудь многопоточные оптимизации. Правда это к mysql больше относится, но думаю что ситуация с sqlite не лучше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 15:22:03 |
|
||
|
Помогите оптимизировать код
|
|||
|---|---|---|---|
|
#18+
Petro123 , тем не менее пинание колеса не чинит машину, а у меня значительный прирост скорости. Сколько всего индексов в таблице? 2 С 57 до 11 только из-за индексов? С 20 до 11. Там выше мой комментарий про 20 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 15:34:28 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38158888&tid=2129940]: |
0ms |
get settings: |
14ms |
get forum list: |
18ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
47ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 316ms |
| total: | 480ms |

| 0 / 0 |
