powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите оптимизировать код
16 сообщений из 41, страница 2 из 2
Помогите оптимизировать код
    #38157084
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WalterSullivan1Сейчас пытаюсь распараллелить как советовал Blazkowicz .
Это не я советовал. Я советовал выкинуть лишнее перекладывание байтов из потока в StringBuilder. А распаралеливание - спорное решение с точки зрения Андроида. Вычитка и парсинг будут намного опережать всавку данных. Поэтому резульаты парсинга могут накапливаться в памяти. Хотя 7-10 Мб должно быть не так много.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38157343
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте использовать множественную вставку вида
Код: sql
1.
insert into table(fields) values(val1),(val2)...;


(работает не для всех версий SQLite) подобрать оптимальное кол-во строк (я для андроида делал по 1000)
В любом случае у вас должен быть прирост производительности с пакетом в 1000 записей при подготовленном запросе,
чем вставка всех записей в одной транзакции.
Распараллеливание imho только ухудшит ситуацию. (только для SQLite)
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38157362
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38158577
WalterSullivan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TrogloditПопробуйте использовать множественную вставку вида
Код: sql
1.
insert into table(fields) values(val1),(val2)...;




Спасибо! Ваш вариант не заработал, но работает такой
Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO indices (IDD, WORD, OFFSET, LENGTH)
SELECT ?, ?, ?, ? 
UNION ALL
SELECT ?, ?, ?, ?
UNION ALL
...



Так как SQLite не принимает больше 999 параметров запроса, количество записей за одну вставку пришлось сократить до 249, но метод стал выполняться за 20 секунд.

mayton , я пробовал отключать синхронизацию, выигрыша не получил.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38158709
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczchabapokя бы сразу в стрнгбилдере конструировал групповой инсерт, прамо из входящих данных, и по достижении определенного размера - отправлял его на выполнение.
Что это даст? Каждый новый SQL запрос будет парсится заново если значения заинлайнить.

А разве есть способ избежать повторного парсинга? Помоему, такого способа нет. Если мы засовываем данные через PreparedStatement, то вставка идет по одной строке и накладные расходы процентов на 20 больше. Сэкономили на парсинге - проиграли в других местах.


А если SSD? Андроид ведь.[/quot]
судя по задаче, маловероятно.


BlazkowiczНа самом деле вычитка пройдёт намного быстрее чем инсерты, поэтому не на что это особо не повлияет. Но есть смысл ограничить размер очереди, чтобы всё в памяти не держать, а заблокировать чтение на время, пока набор данных сбросится в базу.


к сожалению (или к счастью) операционка начинает распараллеливать одновременный доступ к нескольким файлам, при определенных условиях seek-и головки все сьедают. И задача у топикстартера такая, что ему на эти условия очень легко нарваться.


BlazkowiczSQLite же.
Не замеитл :) Действительно. Ну, с SQLite все значительно проще. Какие головки? Какие потоки? Надо все инсерты сделать в одной транзакции. Будет около 1 секунды на его 50000 записях, скорей всего.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38158773
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WalterSullivan1 Пробовал вместо одной транзакции на 50 000 делать 50 транзакций по 1000, тоже не быстрее.

Учитывая ваш говнокод, я уверен, что вы действительно уменьшили кол-во транзакций. И к тому же, зачем давать 50 по 1000, сделайте одну по 50000.

Там у sqlite есть, насколько помню, несколько режимов работы, один из них - когда базу можно юзать из независимых процессов. Он же самый медленный, и он по умолчанию, однако поиграться другими режимами, но все равно у sqlite основной кушатель времени - это закрывание транзакций.


WalterSullivan1Сейчас пытаюсь распараллелить как советовал Blazkowicz .

Я под андроид ничего не делал, однако навскидку я не могу назвать распараллеливание под андроидом хорошим решением. Распараллеливание полезно там, где железо имеет много ядер. Андроид, все же, не xeon, ядер как правило там мало, очень часто одно. И если вы наплодите десятки потоков - вы сделаете только хуже. Нормально - когда кол-во потоков чуть больше или равно кол-ву ядер.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38158775
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буферизировать можно. Правда данные не сразу будут доступны
для чтения из БД но если такое допущение возможно то для
оптимизации почему бы и нет?
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38158778
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokЯ под андроид ничего не делал, однако навскидку я не могу назвать распараллеливание под андроидом хорошим решением. Распараллеливание полезно там, где железо имеет много ядер. Андроид, все же, не xeon, ядер как правило там мало, очень часто одно. И если вы наплодите десятки потоков - вы сделаете только хуже. Нормально - когда кол-во потоков чуть больше или равно кол-ву ядер.
Есть смысл отделить вставку в базу, так как она занимает кучу локального IO, от остального кода, который занимает CPU. Чтение ещё надо посмотреть откуда происходит.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38158823
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

1. разве внутри драйвера SQLite такого отделения не сделано?
2. пусть он посчитает через System.currenttimeMillis() сколько у него суммарно длится выполнение внутри его инсерта. Как-то я не доверяю профайлеру, замечал что он не всегда корректно показывает. Если его значение получится близко к 100% от всего выполнения, то параллелить нет смысла, даже если движок БД это не делает. Как-то так:

long t=0;
...
long before = System.currenttimeMilles();
stmt.executeInseert()
t = t+ (System.currenttimeMilles()-before);
...

И вконце сравнить t с временем выполнения всей программы.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38158888
WalterSullivan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На время вставки дропнул индексы, скорость выполнения упала до 11 секунд. Это меня устраивает, всем спасибо за предложения.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38159052
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WalterSullivan1На время вставки дропнул индексы, скорость выполнения упала до 11 секунд. Это меня устраивает, всем спасибо за предложения.

мой мозг пасует.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38159066
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WalterSullivan1На время вставки дропнул индексы, скорость выполнения упала до 11 секунд. Это меня устраивает, всем спасибо за предложения.
не зря говорят, когда не заводится машина - попинай колесо, проверь бензин в баке)))))
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38159071
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В некоторых БД для загрузки делают т.н. специальные одноразовые
таблицы. Они без индексов, констрейнтов и триггеров. Их задача
просто принять данные из внешнего источника (loaders, etl-s).
Далее какие-то бизнес процессы будут по расписанию подхватывать
эти таблицы, чистить от грязных данных, обогащать и вливать
в основную модель.

Вопрос согласованности данных остаётся за кадром. Просто
разработчик с аналитиком решают в какой момент данные
становятся "видны" для модели в целом.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38159107
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WalterSullivan1На время вставки дропнул индексы, скорость выполнения упала до 11 секунд. Это меня устраивает, всем спасибо за предложения.
С 57 до 11 только из-за индексов?
Сколько всего индексов в таблице?
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38159161
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WalterSullivan1,

подозреваю, что у вас там к тому же индексы сделаны неправильно. Очень часто (всегда) сталкивался, что люди ставят целую кучу лишних индексов, но при этом не ставят нужных. В результате у них база тормозит - а они начинают делать какие-нибудь многопоточные оптимизации. Правда это к mysql больше относится, но думаю что ситуация с sqlite не лучше
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38159191
WalterSullivan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123 , тем не менее пинание колеса не чинит машину, а у меня значительный прирост скорости.

Сколько всего индексов в таблице?
2

С 57 до 11 только из-за индексов?
С 20 до 11. Там выше мой комментарий про 20 секунд.
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите оптимизировать код
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]