Регистрация  |  Вход

Вопрос по батчам.

Всем привет. Столкнулся с такой проблемой при работе с такой задачей:
Есть организации в количестве 200к+. Их нужно достать из базы, обработать и обновить.
Проблема в том, что, насколько я знаю, записи обрабатываются в батче пачками. Но мне нужно собрать их всех в одну кучу, иначе я никак не смогу их оработать(то есть нужные записи могут оказаться в разных пачках, что недопустимо).
Что я пробовал: в методе start() вытягивал записи с помощью Database.QueryLocator и собирал в карту с помощью Database.QueryLocatorIterator. Там же обрабатывал, а в методе execute просто обновлял их пачками. Это не сработало. Из за использования итератора на старте, ругается на лимиты(50000 записей).(в документации даже есть такой пункт)

Какие есть идеи? Как мне собрать все записи в кучу и только потом обновлять?
Надеюсь, проблему объяснил понятно и адекватно. Буду благодарен советам.

Пока я вижу такое решение:
В батче в execute - методе, собирать также записи в карту и ставить метку на кастомное поле. В методе finish() обработать, и вызвать второй батч, отправив в него конструктором собранную карту, который будет по метке выцеплять эти же записи, а в execute доставать из карты, снимать метку и апдейтить пачками, как он и любит.

P.S. Простите за вынесенный мозг, если что

Всем привет. Столкнулся с такой проблемой при работе с такой задачей:
Есть организации в количестве 200к+. Их нужно достать из базы, обработать и обновить.
Проблема в том, что, насколько я знаю, записи обрабатываются в батче пачками. Но мне нужно собрать их всех в одну кучу, иначе я никак не смогу их оработать(то есть нужные записи могут оказаться в разных пачках, что недопустимо). 
Что я пробовал: в методе start() вытягивал записи с помощью Database.QueryLocator и собирал в карту с помощью Database.QueryLocatorIterator. Там же обрабатывал, а в методе execute просто обновлял их пачками. Это не сработало. Из за использования итератора на старте, ругается на лимиты(50000 записей).(в документации даже есть такой пункт)

Какие есть идеи? Как мне собрать все записи в кучу и только потом обновлять?
Надеюсь, проблему объяснил понятно и адекватно. Буду благодарен советам.

Пока я вижу такое решение:
В батче в execute - методе, собирать также записи в карту и ставить метку на кастомное поле. В методе finish() обработать, и вызвать второй батч, отправив в него конструктором собранную карту, который будет по метке выцеплять эти же записи, а в execute доставать из карты, снимать метку и апдейтить пачками, как он и любит.

P.S. Простите за вынесенный мозг, если что :)



artemiblack
Пока я вижу такое решение:

Все зависит от того как часто это нужно. Если один раз то проще через етл сделать или через страницу с readonly она позволяет вытянуть вроде 1000000 записей

[quote="artemiblack"]Пока я вижу такое решение: [/quote]
Все зависит от того как часто это нужно. Если один раз то проще через етл сделать или через страницу с readonly она позволяет вытянуть вроде 1000000 записей

wilder
Все зависит от того как часто это нужно. Если один раз то проще через етл сделать или через страницу с readonly она позволяет вытянуть вроде 1000000 записей

Главное, чтобы запрос был selective

[quote="wilder"]Все зависит от того как часто это нужно. Если один раз то проще через етл сделать или через страницу с readonly она позволяет вытянуть вроде 1000000 записей[/quote]
Главное, чтобы запрос был selective

artemiblack
Но мне нужно собрать их всех в одну кучу, иначе я никак не смогу их оработать(то есть нужные записи могут оказаться в разных пачках, что недопустимо).

Все-таки это в корне неправильный подход. Может стоит подумать чтобы разбить эту обработку на несколько шагов с промежуточными данными. Например создать слубежный объект и записывать туда промежуточные данные, которые позволят избавиться от проблемы с тем чтобы вытягивтаь все данные. Скажем подготовить необходимые данные по 200k+ организациям в виде json и потом использовать именно его для исходных данных, а не тянуть все записи.

[quote="artemiblack"]Но мне нужно собрать их всех в одну кучу, иначе я никак не смогу их оработать(то есть нужные записи могут оказаться в разных пачках, что недопустимо). [/quote]
Все-таки это в корне неправильный подход. Может стоит подумать чтобы разбить эту обработку на несколько шагов с промежуточными данными. Например создать слубежный объект и записывать туда промежуточные данные, которые позволят избавиться от проблемы с тем чтобы вытягивтаь все данные. Скажем подготовить необходимые данные по 200k+ организациям в виде json и потом использовать именно его для исходных данных, а не тянуть все записи.

Все зависит от того как часто это нужно. Если один раз то проще через етл сделать или через страницу с readonly она позволяет вытянуть вроде 1000000 записей

Процесс запускается по кнопке.

Все-таки это в корне неправильный подход. Может стоит подумать чтобы разбить эту обработку на несколько шагов с промежуточными данными. Например создать слубежный объект и записывать туда промежуточные данные, которые позволят избавиться от проблемы с тем чтобы вытягивтаь все данные. Скажем подготовить необходимые данные по 200k+ организациям в виде json и потом использовать именно его для исходных данных, а не тянуть все записи.

Пока не понимаю чем же такой подход правилен, но это тоже решение. Обязательно рассмотрю этот вариант, спасибо!

[quote]Все зависит от того как часто это нужно. Если один раз то проще через етл сделать или через страницу с readonly она позволяет вытянуть вроде 1000000 записей[/quote]
Процесс запускается по кнопке.

[quote]Все-таки это в корне неправильный подход. Может стоит подумать чтобы разбить эту обработку на несколько шагов с промежуточными данными. Например создать слубежный объект и записывать туда промежуточные данные, которые позволят избавиться от проблемы с тем чтобы вытягивтаь все данные. Скажем подготовить необходимые данные по 200k+ организациям в виде json и потом использовать именно его для исходных данных, а не тянуть все записи.[/quote]
Пока не понимаю чем же такой подход правилен, но это тоже решение. Обязательно рассмотрю этот вариант, спасибо!

artemiblack
Процесс запускается по кнопке.

И каждый раз нужно перелопатить всю базу ??? Тут что-то не так либо с архитектурой работы либо со структурой базы.

[quote="artemiblack"]Процесс запускается по кнопке.[/quote]

И каждый раз нужно перелопатить всю базу ??? Тут что-то не так либо с архитектурой работы либо со структурой базы.

И каждый раз нужно перелопатить всю базу ??? Тут что-то не так либо с архитектурой работы либо со структурой базы.

Так желает заказчик..

[quote]И каждый раз нужно перелопатить всю базу ??? Тут что-то не так либо с архитектурой работы либо со структурой базы.[/quote]

Так желает заказчик..

А все же, почему пачками нельзя обрабатывать?! я несколько раз вчитывался, так и не понял...

А все же, почему пачками нельзя обрабатывать?! я несколько раз вчитывался, так и не понял...

А все же, почему пачками нельзя обрабатывать?! я несколько раз вчитывался, так и не понял...

У каждой организации есть ВнешнийId группы. Нужно собрать их по группам, выявить "альфу", и перекинуть на нее все привязанные записи из "неальф" и значения некоторых полей.
Я не представляю, как это сделать при обработке пачками, если, например, организации одной группы окажутся в разных пачках.

[quote]А все же, почему пачками нельзя обрабатывать?! я несколько раз вчитывался, так и не понял...[/quote]
У каждой организации есть ВнешнийId группы. Нужно собрать их по группам, выявить "альфу", и перекинуть на нее все привязанные записи из "неальф" и значения некоторых полей. 
Я не представляю, как это сделать при обработке пачками, если, например, организации одной группы окажутся в разных пачках.

artemiblack
Я не представляю, как это сделать при обработке пачками

Вот буквально несколько минут назад закончил батч, который перелапачивает 106000 лидов и делает из них контакты и аккаунты. Стандартный функционал по конвертации не задействовал в виду его глючности. Все было написано на JS, ввиду дебилизма платформы салесфорс. Очень остался доволен результатом. Правда мне нужно было всего один раз переделывать данные. Хотя не вижу особенной проблемы делать это на регуллярной основе.

[quote="artemiblack"]Я не представляю, как это сделать при обработке пачками[/quote]

Вот буквально несколько минут назад закончил батч, который перелапачивает 106000 лидов и делает из них контакты и аккаунты. Стандартный функционал по конвертации не задействовал в виду его глючности. Все было написано на JS, ввиду дебилизма платформы салесфорс. Очень остался доволен результатом. Правда мне нужно было всего один раз переделывать данные. Хотя не вижу особенной проблемы делать это на регуллярной основе.

artemiblack
А все же, почему пачками нельзя обрабатывать?! я несколько раз вчитывался, так и не понял...

У каждой организации есть ВнешнийId группы. Нужно собрать их по группам, выявить "альфу", и перекинуть на нее все привязанные записи из "неальф" и значения некоторых полей.
Я не представляю, как это сделать при обработке пачками, если, например, организации одной группы окажутся в разных пачках.

Можно попробовать подход с chaining batches: по нажатию на кнопку вы делаете запрос в базу и вытаскиваете первый попавшийся externalID группы, и запускаете батч, который выгребает организации, только из этой группы, собирать их в пачку можете прямо внутри батча, сделав его Database.Stateful, в методе finish можете устроить обработку всей пачки и запуск следующего такого же батча, но для следующей группы.

[quote="artemiblack"][quote]А все же, почему пачками нельзя обрабатывать?! я несколько раз вчитывался, так и не понял...[/quote]
У каждой организации есть ВнешнийId группы. Нужно собрать их по группам, выявить "альфу", и перекинуть на нее все привязанные записи из "неальф" и значения некоторых полей. 
Я не представляю, как это сделать при обработке пачками, если, например, организации одной группы окажутся в разных пачках.[/quote]

Можно попробовать подход с chaining batches: по нажатию на кнопку вы делаете запрос в базу и вытаскиваете первый попавшийся externalID группы, и запускаете батч, который выгребает организации, только из этой группы, собирать их в пачку можете прямо внутри батча, сделав его Database.Stateful, в методе finish можете устроить обработку всей пачки и запуск следующего такого же батча, но для следующей группы.