powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите оптимизировать код
41 сообщений из 41, показаны все 2 страниц
Помогите оптимизировать код
    #38155569
WalterSullivan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Задача: считать из файла набор структур и записать их в базу данных. Структура имеет вид:
char* word; // null-terminated строка
unsigned int32 offset; // сетевой порядок байт
unsigned int32 size; // сетевой порядок байт


Написал следующий код, но меня не устраивает скорость. Есть ли возможность как-то это оптимизировать?

Вот, что говорит профайлер:
self - 15,4%
SQLIteStatement.executeInsert - 39,3%
StringBuilder.append - 11,3%
SQLiteProgram,bundLong - 7,3%
BufferedInputStream.read() - 5,1%
...


Код: 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.
String word = "";
long offset = 0;
long size = 0;
short[] shortArray = new short[4];
byte[] byteArray = new byte[4];
long currentIndex = 0;
SQLiteStatement statement = db.compileStatement(
		"INSERT INTO indices" +
		"(IDD, WORD, OFFSET, LENGTH) " +
		"VALUES " +
		"(?, ?, ?, ?);"
		);

statement.bindString(1, String.valueOf(dId));


while(true) {
	result = bufferedInputStream.read();
	
	if (result == -1) {
		break;
	} else if (result == 0) {
		currentIndex++;
		
		word = stringBuilder.toString();
		stringBuilder.delete(0, word.length());
		
		bufferedInputStream.read(byteArray);
		
		for (int i = 0; i < 4; i++) {
			shortArray[i] = (short)(byteArray[i] < 0 ? byteArray[i] + 256 : byteArray[i]);
		}
		offset = (shortArray[0] << 24) | (shortArray[1] << 16) | (shortArray[2] << 8) | shortArray[3];
		
		bufferedInputStream.read(byteArray);
		for (int i = 0; i < 4; i++) {
			shortArray[i] = (short)(byteArray[i] < 0 ? byteArray[i] + 256 : byteArray[i]);
		}
		size = (shortArray[0] << 24) | (shortArray[1] << 16) | (shortArray[2] << 8) | shortArray[3];
		
		
		statement.bindString(2, word);
		statement.bindLong(3, offset);
		statement.bindLong(4, size);
		statement.executeInsert();
		
	} else {
		stringBuilder.append((char)result);
	}
}
bufferedInputStream.close();
}
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155580
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WalterSullivan1,

сколько записей в базу вставляете в среднем, распарсив 1 файл?
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155590
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sqlite.org/faq.html#q19
Для начала использовать batch insert, если цикл повторяется много раз.
Во-вторых выкинуть нафиг StringBuilder - зачем байты туда-сюда перекладывать, по отдельности конвертируя в Char. Читайте в byte[] достаточной длины, а потом просто из него уже делайте String, если это действительно так необходимо. А там без String обойтись никак нельзя?
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155602
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё интересный момент в том что 1 символ это далеко не всегда 1 байт. Для некоторых кодировок ваш код вообще не будет работать.
Кодировки, кстати, хорошо бы указывать явно. На разных девайсах текущая кодировка может быть разной и она не обязательно будет совпадать с кодировкой источника ваших данных.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155607
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Особо не заоптимизируешь, так как
SQLIteStatement.executeInsert - 39,3%
Разве что вынести вставку в отдельный поток, или даже пул, если движок SQLite позволит. Вот пример на 20 потоков:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
		BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
		ExecutorService service = new ThreadPoolExecutor(
				0, 20, 60L, TimeUnit.SECONDS, queue);
		// цикл чтения
		while (true) {
		...
			service.execute(new Runnable() {
				@Override
				public void run() {
					// задание на вставку
					statement.bindString...
				}
			});
		}// конец цикла
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155624
WalterSullivan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверинсколько записей в базу вставляете в среднем, распарсив 1 файл?
Тестирую на небольшом файле - 50 000, большие файлы - до 500 000.

BlazkowiczЧитайте в byte[] достаточной длины
Строки - null-terminated, неизвестно сколько читать.

BlazkowiczКодировки, кстати, хорошо бы указывать явно
А как это сделать? В исходном файле кодировка - utf-8.

ivanra , спасибо, попробую.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155638
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WalterSullivan1BlazkowiczЧитайте в byte[] достаточной длины
Строки - null-terminated, неизвестно сколько читать.

Читайте в буфер, вместо использования BufferedInputStream, а буфер уже сканируйте на терминатор. В этом случае вам нужно будет только склеивать две части byte[] при чтении следующего куска. Это будет намного быстре чем "склеивать" каждый символ.
http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read%28byte [],%20int,%20int%29


WalterSullivan1BlazkowiczКодировки, кстати, хорошо бы указывать явно
А как это сделать? В исходном файле кодировка - utf-8.

Вот конструктор, указываете участок буфера, который слово и явно кодировку.
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#String(byte [],%20int,%20int,%20java.lang.String)
Нужно будет только исхитрится когда слово разорвано на два буфера.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155639
WalterSullivan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И да, все вставки выполняются внутри транзакции.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155644
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WalterSullivan1 ivanra , спасибо, попробую.
Если этот движок поддерживает batch insert, то конечно, прежде всего надо использовать пакетную вставку, 100-1000 записей за раз (подобрать опытным путем), ну а пакеты уже можно и распараллеливать.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155648
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraОсобо не заоптимизируешь, так как
SQLIteStatement.executeInsert - 39,3%
Разве что вынести вставку в отдельный поток, или даже пул, если движок SQLite позволит. Вот пример на 20 потоков:

Мысль дельная. Хотя это наверное Андроид и достаточно ресурсов будет не всегда.
Но, в целом, тут можно смело разносить на 3 потока.
1 - чтение
2 - разбивка
3 - вставка - здесь нужна большая очередь, т.к. это самый медленный процесс. Для многопоточной вставки нужно иметь соединение на поток. Вряд ли это что-то даст. Тут нужен просто batch insert.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155668
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WalterSullivan1,

batch инсерт , либо формируйте какой-нить csv файл и потом одной операцией заливайте его в базу(так многократно быстрее будет, чем вставлять 500 000 раз 1 запись)
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155675
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинWalterSullivan1,
batch инсерт , либо формируйте какой-нить csv файл и потом одной операцией заливайте его в базу(так многократно быстрее будет, чем вставлять 500 000 раз 1 запись)
Если файл формировать локально, то его запись тоже уйму времени может отнять.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155689
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, строки удобнее читать сканером, а не побайтно:
Код: java
1.
2.
3.
4.
5.
6.
7.
        Scanner scanner = new Scanner(bufferedInputStream, "UTF-8");
        scanner.useDelimiter("");
        while (scanner.hasNext()) {
            word = scanner.next();
            bufferedInputStream.read(byteArray);
            // и т.д.
        }
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155690
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraWalterSullivan1 ivanra , спасибо, попробую.
Если этот движок поддерживает batch insert, то конечно, прежде всего надо использовать пакетную вставку, 100-1000 записей за раз (подобрать опытным путем), ну а пакеты уже можно и распараллеливать.
Только перед этим стоить почитать о том, что как там с поддержкой мультитрединга в sqlite http://www.sqlite.org/threadsafe.html] http://www.sqlite.org/threadsafe.html , а то мало ли что.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155727
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОзверинWalterSullivan1,
batch инсерт , либо формируйте какой-нить csv файл и потом одной операцией заливайте его в базу(так многократно быстрее будет, чем вставлять 500 000 раз 1 запись)
Если файл формировать локально, то его запись тоже уйму времени может отнять.

<< времени вставки.
При условии, что рам у нас ограничено сильнее обычного (андроид) - это лучше batch инсертов, я так думаю.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155745
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинПри условии, что рам у нас ограничено сильнее обычного (андроид) - это лучше batch инсертов, я так думаю.на сколько я понимаю, невозможно импортировать csv в андроиде напрямую. единственный способ ускорения это batch. на счет нескольких писателей в БД в потоках я тоже сильно сомневаюсь, но лень гуглить.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155793
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraКстати, строки удобнее читать сканером, а не побайтно:
Поскольку в данном случае числа записаны в бинарном виде, то сканер не поможет. Разве что написать свою реализацию, используя исходники.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155800
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaОзверинПри условии, что рам у нас ограничено сильнее обычного (андроид) - это лучше batch инсертов, я так думаю.на сколько я понимаю, невозможно импортировать csv в андроиде напрямую. единственный способ ускорения это batch. на счет нескольких писателей в БД в потоках я тоже сильно сомневаюсь, но лень гуглить.

я не знаток андроида, но есть подозрение, что это более зависит от базы.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155954
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще nio channel можно попробовать например
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155960
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагманеще nio channel можно попробовать например
Смысл?
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38155974
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озвериня не знаток андроида, но есть подозрение, что это более зависит от базы.
она там одна ;) . т.е. теоретически можно использовать другие, но на практике...
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38156132
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

вдруг байты быстрее поползут )
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38156356
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы сразу в стрнгбилдере конструировал групповой инсерт, прамо из входящих данных, и по достижении определенного размера - отправлял его на выполнение.

и еще - напишите сколько строк в секунду у вас вставляется и сколько хотелось бы чтоб вставляло.

Параллелить по потокам, на мой взгляд смысла нет, все равно винчестер один (один ведь?), и вы получете затык на io, еще может дыже и хуже работать будет (тут как карта ляжет, пргнозировать сложно), т.к. обращение идет одновременно к исходному файлу и к файлам баз, и как головка будет делать seek - одной ОС известно. Самый быстрый способ - последовательный. На мой взгляд, разносить по потокам имеет смысл только если входной файл и база на разных винчестерах, либа вся база помещается в памяти (но судя по задачи это не ваш случай)

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

chabapokПараллелить по потокам, на мой взгляд смысла нет, все равно винчестер один (один ведь?)

А если SSD? Андроид ведь.


chabapok, и вы получете затык на io, еще может дыже и хуже работать будет (тут как карта ляжет, пргнозировать сложно), т.к. обращение идет одновременно к исходному файлу и к файлам баз, и как головка будет делать seek - одной ОС известно. Самый быстрый способ - последовательный. На мой взгляд, разносить по потокам имеет смысл только если входной файл и база на разных винчестерах, либа вся база помещается в памяти (но судя по задачи это не ваш случай)
На самом деле вычитка пройдёт намного быстрее чем инсерты, поэтому не на что это особо не повлияет. Но есть смысл ограничить размер очереди, чтобы всё в памяти не держать, а заблокировать чтение на время, пока набор данных сбросится в базу.

chabapokв MyISAM получалось 40000 инсертов-сек, но если добавляешь индексы - производительность может падать на несколько порядков.
SQLite же.
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #38156769
WalterSullivan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chabapokи еще - напишите сколько строк в секунду у вас вставляется и сколько хотелось бы чтоб вставляло.
Файл на 700 Kb содержит ~50 000 записей, выполнение метода на устройстве занимает 57 секунд, хотелось бы секунд за 20 хотя-бы.

Как я понял SQLite на андроид не поддерживает batch insert (поправьте меня, если я не прав).
Пробовал отключать журналирование, тоже не помогло.
Пробовал вместо одной транзакции на 50 000 делать 50 транзакций по 1000, тоже не быстрее.

Сейчас пытаюсь распараллелить как советовал Blazkowicz .
...
Рейтинг: 0 / 0
Помогите оптимизировать код
    #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
41 сообщений из 41, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите оптимизировать код
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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