powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
25 сообщений из 471, страница 1 из 19
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
    #40040357
Фотография miltorg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считает слишком долго. Уже 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
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
    #40040358
Фотография miltorg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Часть таблицы:

Код: 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
Считает слишком долго. Уже 2 сутки. Как оптимизировать скорость?
    #40040359
Фотография miltorg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кто то не читал предыдущею тему:

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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