Максим
То есть не станет ли база узким местом если я в несколько воркеров делать
Anton
База почти всегда узкое место 🙂
Anton
тем более на 113М инсертов
Максим
я бы думал про несколько потоков и с разных частей файла пускать
тоже пришел к такому решению, поделить по частям, сместить указатель до нужного места и читать
Максим
тем более на 113М инсертов
ну не 113, можно инсертить несколько строк за раз
Anton
я про сумму
Максим
это да
Anton
просто БД должна все эти данные на винт скинуть
Anton
даже последовательная запись на диск 1.5 Гб время занимает 🙂
Anton
а у тебя будут рандом сики
Anton
ну если в несколько потоков
Anton
так что узким местом у тебя ну не совсем БД будет, а диск
Anton
идейно можно подумать в сторону быстрых дисков (fuision io или что там сейчас есть), но это как самолет стоит
Anton
это да
Задача очень хорошая для собеседования...
Максим
не по железу ничего не поменяешь, у меня нет доступа к базе и где она лежит я тоже не знаю)
Максим
* к серверу базы
Anton
а будут всегда инсерт или апдейты тоже?
Andrey
ну не 113, можно инсертить несколько строк за раз
у нас есть похожая задача, на каждый день, запускатся по расписанию, дальше смотрит сколько строк в файле, делит по 10 000 записей и запускает 20 потоков. Каждый поток со смещением берет записи, делает транзакцию
Anton
воркеры ларавеля?
что ты называешь воркерами ларавеля?
Anton
у тебя явно не очереди, а крон скрипт с pcnt_fork
Andrey
ну первый, инициирующий скрипт смотрит количество строк и потом раздает фоновое выполнение артизан команде с параметрами смещения
Anton
Хотя... откуда я знаю 🙂
Anton
ну первый, инициирующий скрипт смотрит количество строк и потом раздает фоновое выполнение артизан команде с параметрами смещения
Абсолютно офигенное решение - мастер скрипт, который оценивает работу и запускает скрипты или генерит джобы
Andrey
да нет, почему джобы
Andrey
мысли шире ларавела)
Anton
команды можно запускать в бэкгроунде - не ждя завершения в мастер скрипте
Максим
Окей, а отслеживать их успешность как?
Andrey
system('/usr/bin/php /path/to/artisan do:somth 12000')
Anton
Окей, а отслеживать их успешность как?
Если ты хочешь из скрипта родителя отслеживать - то вроде как только pcntl_fork
Anton
хотя по моему еще чем-то форкаться можно
Andrey
Добрый день! Нужно залить в базу файл csv (два поля, разделитель ,) в котором 133 млн строк (размер 1,5 гб) Как это можно ускорить? Понятно что можно считать по строкам и инсертить например по 1000 штук Может можно распараллелить как то? Какие есть идеи?
Можно в csv строки преобразовать в инсерты просто заменой по файлу из командной строки и залить в любую базу без участия пхп. (mysql поддерживает импорт из csv без таких плясок)
Andrey
Окей, а отслеживать их успешность как?
у нас это каждый день происходит, если при транзакции эксепшн, нас уведомляет через телеграм бота об этом. но этого ни разу не было в бою) мы не запаривались
Максим
system('/usr/bin/php /path/to/artisan do:somth 12000')
короче этот вариант норм, попробую это
Максим
спасибо
Andrey
этот вариант не подходит, если бы нужно было просто залить не обрабатывая строки то можно было залить базой
слушай, ну как вариант, если это одноразовая операция, можешь написать быстрий скрипт, чтобы из твоего CSV сваял тебе SQLDump запрос (c тучей инсертов) а потом через консольный mysql скормишь файл в терминале
Andrey
да не, ниче)
прочитал, но он тебя не понял похоже,
Andrey
он написал что надо "обрабатывать строки"
Andrey
можем сразиться в выяснении кто кого не понял) но думаю, что тема закрыта
Максим
он написал что надо "обрабатывать строки"
да, вилидировать + еще смотреть в той же таблице в которую заливаем есть ли там уже такая строка или нет, если есть то в отдельную табличку помечать что строка есть, дубль, либо успешно добавлена
Andrey
а инмемори нет возможности это сделать?
Максим
у меня два поля, серия и номер паспорта, там всегда цифры
Andrey
у меня два поля, серия и номер паспорта, там всегда цифры
ты чтоли БД правительства Индии скачал, которую недавно слили?)) столько записей у тебя)
Andrey
Кстати, если надо просто не надобавлять дублей есть - INSERT IGNORE - REPLACE или - ON DUPLICATE UPDATE они работают существенно быстрее чем SELECT и затем INSERT
Алексей
Люди, подскажите, пожалуйста, как лучше (и как обычно) работают с сессиями в Laravel? Например, у нас есть таблица active_sessions, в которую должны заноситься сессии пользователей. Может ли один пользователь (и должен ли) иметь несколько сессий одновременно? Например, с домашнего компьютера и с рабочего? Соответственно, в таблице будет две записи. Извините, если выражаю свои мысли неясно, я новичок.
Максим
Максим
каждый день тетя из мвд обновляет его руками)
Andrey
только через сервис
invariance
почаны а зачем нужны model factory?
Alexander
https://laravel.com/docs/5.6/seeding#using-model-factories
Andrey
https://laravel.com/docs/5.6/seeding#using-model-factories
мне кажется это был риторический вопрос от админа, типа, че вы тут обсуждате, если есть модел фактори
Alexander
))
invariance
Route::get('/', \App\Http\Controllers\API\BotController::class.'@index');
invariance
как охуенно
invariance
теперь такой формат ВООБЩЕ не работает
invariance
я думал только для ресурсов
invariance
🤦‍♂️
Andrey
в прошлом работало?
invariance
надо глянуть как в ботмане сделано
Andrey
Так мне надо отмечать какая запись дубль. Ни один из этих не вернёт мне строку
If you use INSERT IGNORE and the row is ignored, the AUTO_INCREMENT counter is not incremented and LAST_INSERT_ID() returns 0 Т.е. если вернул 0, запись - дубль
Andrey
есть еще affected_rows
Andrey
по которому тоже можно понять
Alexander
Подскажите, можно ли получить оригинальные данные после update, getOriginal возвращает то же самое
Алексей
Ребят, помогите с релейшеном: Есть таблица Products. Также есть таблица ComposedProductProducts, в ней содержатся product_id, child_product_id, amount. Комбинированный продукт состоит из нескольких обыкновенных, но тоже хранится в Products. То есть, Product имеет релейшн hasMany(ComposedProductProduct) и одновременно belongsToMany(ComposedProductProduct) ?