Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость? / 25 сообщений из 471, страница 1 из 19
01.02.2021, 03:29
    #40040357
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?

Код: php
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.
66.
67.
68.
require "./baza.pl";

$tab1 = 'n9n1';

$tab2 = 'n9n2';



$dbh->do("SET autocommit=0");



$s = "SELECT * FROM $tab1 where sovpalo=10";
$sth = $dbh->prepare($s);
$sth->execute;



   
while (@r = $sth->fetchrow_array){
  
  @a = split /_/, $r[1];

  print "$r[0]\n";


  $s2 = "SELECT * FROM $tab1 where str1=$r[5] or str2=$r[5]";
  $sth2 = $dbh->prepare($s2);
  $sth2->execute;
  while (@r2 = $sth2->fetchrow_array){
    next if $r2[0] <= $r[0];
    
    
    @b = (); %isect = (); %inion = ();



    @b = split /_/, $r2[1];

    #print @a;print "\n";
    #print @b;print "\n";


    for $e (@a, @b) {$inion{$e}++ && $isect{$e}++;}

    @isect = keys %isect;

    $is = scalar(@isect);

    if($is > 8){
      $r = join('_', sort {$a<=>$b} @isect );
      
      $dbh->do("INSERT INTO $tab2 VALUES (null, '$r', '$r[4]-$r[5]-$r2[4]-$r2[5]', $is)");

    }
    
    #print "$r2[0]\n";
     

    }
  }

$dbh->do("COMMIT");
   

$sth->finish;
$sth2->finish;
$dbh->disconnect;
...
Рейтинг: 0 / 0
01.02.2021, 03:33
    #40040358
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Часть таблицы:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
+----+---------------------------------+----------+-----------+------+------+---------+
| id | d1                              | myData1  | myData2   | str1 | str2 | sovpalo |
+----+---------------------------------+----------+-----------+------+------+---------+
|  1 | 5_7_8_27_39_50_58_62_70         | 2.1.2012 | 8.1.2012  |    0 |    6 |       9 |
|  2 | 8_22_23_34_37_43_50_55_57       | 2.1.2012 | 5.2.2012  |    0 |   34 |       9 |
|  3 | 5_15_27_34_37_39_40_57_62_70    | 2.1.2012 | 20.2.2012 |    0 |   49 |      10 |
|  4 | 5_8_15_22_27_37_43_58_70        | 2.1.2012 | 7.3.2012  |    0 |   65 |       9 |
|  5 | 8_22_23_27_39_40_44_50_55_57    | 2.1.2012 | 9.3.2012  |    0 |   67 |      10 |
|  6 | 5_7_8_27_37_39_40_58_62         | 2.1.2012 | 27.3.2012 |    0 |   85 |       9 |
|  7 | 15_23_34_37_40_41_43_44_58      | 2.1.2012 | 8.4.2012  |    0 |   97 |       9 |
|  8 | 7_8_23_27_34_41_57_58_70        | 2.1.2012 | 10.4.2012 |    0 |   99 |       9 |
|  9 | 15_22_34_37_40_41_43_55_57      | 2.1.2012 | 11.4.2012 |    0 |  100 |       9 |
| 10 | 5_15_22_23_39_43_44_50_55_57_62 | 2.1.2012 | 16.5.2012 |    0 |  135 |      11 |
+----+---------------------------------+----------+-----------+------+------+---------+
10 rows in set (0.22 sec)



В таблице около миллиона записей.

Спасибо.
...
Рейтинг: 0 / 0
01.02.2021, 03:49
    #40040359
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Если кто то не читал предыдущею тему:

Есть файл - в каждой строке 20 чисел, через пробел, от 1 до 99 включительно.
Около 5 тысяч строк.

Нужно получить совпадения по 9 чисел. Например

5_7_8_27_39_50_58_62_70 - комбинация есть в 5 строках - в 1, 28, 1004, 4300, 4444,
...
Рейтинг: 0 / 0
01.02.2021, 14:22
    #40040494
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
увеличивать буфер, начать с 2G
...
Рейтинг: 0 / 0
01.02.2021, 15:11
    #40040522
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Alex_Ustinov,

А по русски? :-)
...
Рейтинг: 0 / 0
01.02.2021, 15:19
    #40040528
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
miltorg,

таблицы InnoDB? (99% да)
в файле конфигурации
в my.ini (или my.cnf если Линукс)
поставить параметр
Код: sql
1.
2.
[mysqld]
innodb_buffer_pool_size = 2G 

перезапустить сервер
...
Рейтинг: 0 / 0
01.02.2021, 16:01
    #40040554
Fitter2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Alex_Ustinov>
У него "миллиард записей"б там наверное РАМы как минимум 10ки Гб, а он сейчас 2Гб поставит :) Диверсия!!!! ))

Если можете, как рекомендуется, 70% от всей РАМы ставьте.

Я так понял, у вас какой-то там алгоритм, вы можете по тестить его на n записей, потом n*10, n* 100 и посмотреть как растет время поиска, может в алгоритме что-то не то.
...
Рейтинг: 0 / 0
01.02.2021, 16:09
    #40040558
Fitter2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Еще, долго не вдаваясь в вашу проблему, можно писать 20ть чисел в 20ть колонок и включать по ним текстовой поиск.
Просто как идея.
...
Рейтинг: 0 / 0
01.02.2021, 16:22
    #40040567
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Fitter2,

у меня уже есть опыт общения с miltorg.
ничего не говорится о таблицах, алгоритме и т.д.
смотрим контекст
miltorgВ таблице около миллиона записей.
среди "простыни" на PHP я вижу один запрос на MySQL
SELECT * FROM $tab1 where str1=$r[5] or str2=$r[5]

поэтому отвечаю по запросу в стиле ТС

и сравнение (или не сравнение, кто его знает) у него в двух циклах, нет там JOIN-а миллиардного.
фетч из одной таблицы подставляется в фетч другого запроса
...
Рейтинг: 0 / 0
01.02.2021, 16:51
    #40040586
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
и смотреть надо завершение стадии гораздо выше до
$dbh->do("COMMIT");
чтобы понять на чем висит .....2 дня...
...
Рейтинг: 0 / 0
01.02.2021, 16:52
    #40040587
Fitter2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Alex_Ustinov>
Это у него уже вторая лента, в первой начиналось словами "миллиард" :)
Ваша позиция мне понятна. Я так, постёбываюсь :)
...
Рейтинг: 0 / 0
01.02.2021, 17:22
    #40040598
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Alex_Ustinov,

Не висит. Работает. Но в таблице 600 тысяч с лишним строк.

И практически каждую нужно сравнить с каждой и получить количество совпадений и записать в новую таблицу.

В первой таблице - 2 совпадения строк, а в второй таблице - уже 3 совпадения.
...
Рейтинг: 0 / 0
01.02.2021, 18:10
    #40040617
thomas-gatry
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
какой тип таблиц?
...
Рейтинг: 0 / 0
01.02.2021, 18:28
    #40040624
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
miltorg,


Есть SELECT (пусть 600тыс)
Есть одиночные Insert

Что пытаемся оптимизировать - 2 этажный цикл + INSERT?

Можно поставить COMMIT этажом выше, фиксировать порциями. и соответственно использовать INSERT IGNORE на случай сбоя-остановки
сейчас я так понимаю 600тыщ*600тыщ коммитится?
...
Рейтинг: 0 / 0
01.02.2021, 19:48
    #40040671
zyubr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
исходный текстовый файл в 5000+ строк есть смысл вообще привести в более компактный и удобный вид
на дату выделить 2 байта = 0..65535 дней, итого хватает на 179 лет

числа от 1 до 99 в строчке не повторяются, можно представить, как последовательность из 99 битов
если бит выключен - соответственного числа в строчке нет, если включен - есть
это 13 байт

итого, с датой, всего 15 байт на хранение строчки, 75кб+ размер обрабатываемого файла

чтобы сравнить 2 любые строки, перебираем 13 байт каждой, делая побитную операцию & (and) с таким же байтом другой строки
если в итоге какой-то бит включен, значит число, за которое отвечает этот бит, присутствует в обеих строчках

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

сделали & двух байтов для проверки (узнали какие числа совпали), а по байту-результату через таблицу узнали сколько бит в нем включено и приплюсовали в какую-нибудь переменную для суммы
если сумма = 9 или сколько там надо совпадений, перевели все в нормальный текст и выдали в нужный файл

как-то так :)
...
Рейтинг: 0 / 0
01.02.2021, 22:10
    #40040710
zyubr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
...а можно поиграть с файликом 75к, как там еще надо заказчику, например, -
генеришь очередной 13-байтный "ключ" (хоть перебором от 1 до 2^99), в котором включено именно 9 бит из 99
пробегаешь этим ключем по & с каждой строчкой из 5000
совпавшие строки, где все 9 бит включены, направляются в текстовом виде, скажем, во вспомогательный файл
а после подсчета их числа, уже этот весь кусок идет в выходной файл (файлы), сразу сортируясь на нужную позицию по числу строк в куске

как-то так :)
...
Рейтинг: 0 / 0
01.02.2021, 22:58
    #40040726
zyubr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
хотя не, перебирать долго :)
лучше очередной ключ создавать из пар строк, где есть от 9 совпадений :)
...
Рейтинг: 0 / 0
02.02.2021, 00:34
    #40040743
zyubr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
...а в рабочем 75к файле (копии), по которому ключами бегать, оставить только строчки, где есть не менее 9 совпадений ;)
...
Рейтинг: 0 / 0
02.02.2021, 02:20
    #40040748
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Alex_Ustinov,
Немного не так. Первый проход сравнения первоначальной таблицы дал эти самые 600 тысяч совпадений.

Но эти совпадения - почти половина искомые - то есть по 9 чисел

больше 15 чисел совпадений - одна штука
14 чисел - работало 5 мин
13 чисел - 10 мин
12 чисел - около 5 часов
11 чисел - сутки
10 чисел вот теперь - вторые сутки. Вероятно что будет 6 суток.
...
Рейтинг: 0 / 0
02.02.2021, 02:33
    #40040751
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Я не ожидал такого затыка. - Думал что за 2 суток доработает. Ан - нет.
...
Рейтинг: 0 / 0
02.02.2021, 02:37
    #40040752
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Сейчас я просто создаю таблицу совпадений по 9 чисел. Даже окончательно не сравнивая их.
Если бы при первом проходе получились только совпадения по 9 цифр - всё, задача решена.
Но получились совпадения и по 10, и по 11, 12, 13, 14,. 15
...
Рейтинг: 0 / 0
02.02.2021, 02:43
    #40040755
miltorg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
Поэтому я и сравниваю с кем ещё совпало 15 совпадений, например. Сколько этих совпадений. И тд.
...
Рейтинг: 0 / 0
02.02.2021, 10:11
    #40040790
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
ну как бы логичный алгоритм

получаем "дерево" и достаточно глубокое
вхождений 10 из 20-ти больше чем 11 из 20 и т.д. поэтому и будет дольше "перебирать".
все равно основная трата времени на "проверке вхождения"
именно поэтому и предлагали перейти на битовые операции.

это Перл?
надо в Перле посмотреть битовые операции и переделать. Это просто быстрее, хочу-не-хочу

еще вариант исследования - прогнать алгоритм без INSERT в базу посмотреть сколько он отработает (с выводом проиежуточных данных после внутр цикла)

далее - INSERT самая долгая операция, это запись на диск. Оптимизация - быстрые диски (опуская COMMIT и т.д.)
...
Рейтинг: 0 / 0
02.02.2021, 10:26
    #40040793
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
опять же - если это Perl, то лучше спросить в профилирующем форуме PHP, Perl, Python
...
Рейтинг: 0 / 0
02.02.2021, 10:34
    #40040796
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
miltorg,

Кстати, да. Mysql у тебя находится где? Попорбуй делать или INSERT DELAYED, или поставь автокоммит, или не делай insert в базу, а записывай в файл, потом заливай в бд.

Повторю, что эта задача решается в памяти полностью за секунды, ты занимаешься ерундой.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость? / 25 сообщений из 471, страница 1 из 19
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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