Вернуться   Форум SAPE.RU > Общие вопросы > Разработка и сопровождение сайтов

-->
Ответ
 
Опции темы
Старый 31.07.2009, 23:24   #1
Магистр
 
Аватар для Йода
 
Регистрация: 04.12.2007
Сообщений: 3,680
Вес репутации: 416
Йода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущее
По умолчанию Одновременное множественное обращение к строке- помогите решить (MySql4.1)

Камрады! Кто шарит- подмогните.
Есть базка. Вней таблички, в табличках, естессн, строки.
Строки надо брать софтинкой, обрабатывать и по результату обработки ставить в этой строке тот или иной флаг (апдейтить, короче); Строка имеет признак того, что она обработанная или необработанная- флажочег, опятьже.. Софтинка берет необработанные и после действа помечает их как обработанные..
Обработка это- процесс ресурсоёмкий, посему экземпляров обработчика (запущенных софтинок) должно быть много. Например 5. Или 100.

Табличка большая- на мильён строк (тоесть это в идеале, если не в идеале- то если не получится работать с большой, буду както чистить, чтоп была маленькая).

Кроме обработчиков, которые обращаются к табличке, есть еще источники, которые в эту табличку строки заносят (создают новые);

Вопрос: как реализовать с максимально возможным сохранением производительности алгоритм взятия строки на обработку отдельным экземпляром обработчика, чтобы не было конфликтов с другими экземплярами.

Лочить таблицу очень не хочется. Это не путь самурая. Хочется как нить хитровыпендрицца

Всю голову сломал, ничё путного не придумал.
Поможите, люди добрые!

__________________
С уважением, Йода
Йода вне форума   Ответить с цитированием
Старый 01.08.2009, 01:11   #2
Новичок
 
Регистрация: 29.01.2009
Сообщений: 83
Вес репутации: 188
Vile7xD - весьма и весьма положительная личностьVile7xD - весьма и весьма положительная личность
По умолчанию

каждому обработчику присвоить кратность, брать кол-во строк из таблицы делить на число обработчиков, и пусть каждый в своей зоне шарахается. как-то так.
Vile7xD вне форума   Ответить с цитированием
Старый 01.08.2009, 01:18   #3
Магистр
 
Аватар для Йода
 
Регистрация: 04.12.2007
Сообщений: 3,680
Вес репутации: 416
Йода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущее
По умолчанию

Цитата:
Сообщение от Vile7xD Посмотреть сообщение
каждому обработчику присвоить кратность, брать кол-во строк из таблицы делить на число обработчиков, и пусть каждый в своей зоне шарахается. как-то так.
Спасибо что написали
Насчет кратности- количество строк постоянно меняется. Оно увеличивается или уменьшается. Причем не обязательно с краев таблички. Поэтому хочется придумать алгоритм "залочивания" строки за обработчиком.
__________________
С уважением, Йода
Йода вне форума   Ответить с цитированием
Старый 01.08.2009, 01:23   #4
Новичок
 
Регистрация: 29.01.2009
Сообщений: 83
Вес репутации: 188
Vile7xD - весьма и весьма положительная личностьVile7xD - весьма и весьма положительная личность
По умолчанию

ну тогда можно прямо так и указать, к какому обработчику эта строка относится, тогда совсем без лока будет, а при добавлении строки ставить индекс обработчика по кругу. Не передерутся.
Vile7xD вне форума   Ответить с цитированием
Старый 01.08.2009, 01:34   #5
Магистр
 
Аватар для Йода
 
Регистрация: 04.12.2007
Сообщений: 3,680
Вес репутации: 416
Йода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущее
По умолчанию

Цитата:
Сообщение от Vile7xD Посмотреть сообщение
ну тогда можно прямо так и указать, к какому обработчику эта строка относится, тогда совсем без лока будет, а при добавлении строки ставить индекс обработчика по кругу. Не передерутся.
Ага. Была такая мысль.
Но:
1. Обработчики разноскоростные с одной стороны и обработка одной строки идет не стандартное количество времени (строки разные)- получится что ктото будет простаивать;
2. Хочется иметь возможность легкого добавления нового обработчика, не завязывая его на регистрацию гдето "на главном компутере"- тоесть поставил новый обработчик, указал ему в конфиге адрес и пароль к базке- и он пошел колбасить..
Или взял, остановил, обработчик и выкинул его. И нигде не нужно их прописывать..

Как считаете? Так можно сделать? Или это слишком жырно?
__________________
С уважением, Йода
Йода вне форума   Ответить с цитированием
Старый 01.08.2009, 01:44   #6
Bannеd
 
Регистрация: 17.09.2008
Сообщений: 6,446
Вес репутации: 368
Последний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущее
По умолчанию

Йода, таблица MyISAM? создайте аналог InnoDB, там встроена построчная блокировка.
или даже в MyISAM можно лишний столбец - флажок (три позиции! 0 незаблокировано, 1 чтение (не записывать), 2 запись (доступ закрыт)) блокировки строки сделать.
Последний Герой вне форума   Ответить с цитированием
Старый 01.08.2009, 09:56   #7
Магистр
 
Аватар для Йода
 
Регистрация: 04.12.2007
Сообщений: 3,680
Вес репутации: 416
Йода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущееЙода - прекрасное будущее
По умолчанию

Последний Герой, про инно-дб, да. Надо пошукать, что у них там с транзакциями..
А вот насчет
Цитата:
Сообщение от Последний Герой Посмотреть сообщение
в MyISAM можно лишний столбец - флажок (три позиции! 0 незаблокировано, 1 чтение (не записывать), 2 запись (доступ закрыт)) блокировки строки сделать
расскажи подробнее. Тока по шагам. А то у меня получается, что все равно есть возможность двум обработчикам засчитать одну строку своей..
__________________
С уважением, Йода
Йода вне форума   Ответить с цитированием
Старый 01.08.2009, 13:53   #8
Bannеd
 
Регистрация: 17.09.2008
Сообщений: 6,446
Вес репутации: 368
Последний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущее
По умолчанию

Цитата:
Сообщение от Йода Посмотреть сообщение
Надо пошукать, что у них там с транзакциями..
BEGIN
SELECT ... FROM ... WHERE ... [FOR UPDATE | LOCK IN SHARE MODE]
[COMMIT|ROLLBACK]

FOR UPDATE - блокирует строку на мертво
LOCK IN SHARE MODE - разрешает другим процессам только читать строку
COMMIT - завершить транзакцию с сохранением данных
ROLLBACK - завершить транзакцию с удалением данных (откат)

Цитата:
Сообщение от Йода Посмотреть сообщение
расскажи подробнее. Тока по шагам. А то у меня получается, что все равно есть возможность двум обработчикам засчитать одну строку своей..
реализация транзакций на низком уровне. тока я ошибся там 1 уровень блокировки сойдет и по-другому чуть чуть все будет, вот про это я и расскажу:
1) добавляете столбец числовой и обнуляете его значение для ВСЕХ строк
2) как только какой то поток хочет обратиться к строкам, он записывает в столбец свой айди, с условием, что столбец равен нулю (примерно так UPDATE SET столбец=айди WHERE столбец=0)
3) далее он считывает столбец, если блокировку удалось установить, то в столбце написан его айди (иначе там либо 0 либой айди другого процесса)
4) если блокировки нет, то возвращаемся к шагу 2
5) если блокировка есть, то можно считать, что строки заблокированы и выполнять с ней любые махинации
6) снимаем блокировку, записывая в столбец 0
Последний Герой вне форума   Ответить с цитированием
Старый 01.08.2009, 14:14   #9
Мне повезёт!
 
Аватар для Alexey
 
Регистрация: 05.05.2007
Сообщений: 1,076
Вес репутации: 276
Alexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущее
По умолчанию

Делить таблицу на равные куски плохо т.к. на миллионе параллельных потоков, даже если все операции одинаково ресурсоемки, всегда найдутся процессы, которые сделают их в 3 раза быстрей чем самый медленный. Это обусловлено внешними факторами, неравномерностью распределения процессорного времени и т.д.

Поэтому к концу работы у вас получится что 2 потока "догрызают" последние 10 000 записей, в то время как остальные 98 уже стоят. Т.е. производительность к концу работы будет заметно снижаться.

Простой и эффективный способ есть такой:
1) В таблицу вводим доп поле `handler`.
2) Каждому процессу присваиваем уникальный идентификатор (например, порядковый номер)
3) Делаем
Код:
UPDATE `table` SET
              `handler`=<идентификатор текущего процесса>
WHERE 
              `handler` is NULL AND
              `is_processed` = 0
LIMIT 1
Таким образом, процесс как бы резервирует за собой эту строчку.
4) Выбираем эту строчку через
Код:
SELECT .... WHERE `handler`=<идентификатор текущего процесса>
и работаем с ней
5) по завершению ставим записи is_processed = 1


Для оптимизации можно резервировать по 10-30 записей за раз, тогда будет меньше накладных расходов на обращение к БД.

Для легкого добавления обработчика сделайте это поле, например, строковым и пишите туда не число, а типа `mycomputer-1` и т.д. В общем, неймспейсы

Совершенно пофигу как и в каком порядка они будут называться. Не забудьте только индекс на это поле поставить.
__________________
Everything will be great in the end.
If it's not great, it's not the end.
Alexey вне форума   Ответить с цитированием
Старый 01.08.2009, 14:19   #10
Bannеd
 
Регистрация: 17.09.2008
Сообщений: 6,446
Вес репутации: 368
Последний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущее
По умолчанию

Alexey, у вас частный случай моего предложения, только в вашем случае к строке может обращаться всего 1 поток и только 1 раз. ТСу же нужны построчные блокировки для нескольких обращений, как это реализовано в иннодб.
Последний Герой вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить проблему . Jenya Курилка 7 04.01.2009 11:27
Помогите решить проблему с MSN Chervechok Курилка 2 12.12.2008 02:26
Помогите решить проблему! yan21 Яндекс 3 20.11.2008 13:08
помогите решить проблему ncx Курилка 24 04.08.2008 20:01
Помогите решить проблемы ara Вопросы по работе системы 5 30.04.2007 22:45


Часовой пояс GMT +3, время: 04:23.