Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Имеется задача импортировать прайс лист Excel или из текстового файла, выбирать отдельные столбцы
и апдейтить соответствующие столбцы в базе.
Затем выбирать некоторые столбцы из импортированного прайса и из базы, и формировать новый
Как это лучше сделать, поместяться ли два три таких массива по 150 Мб в памяти ?
Можно отключить лимит памяти в php.ini, но это дома, а на хостинге будет ППЦ...
Не в сети
Готовый код не дам, только наводки.
Если хочется экономить память, не загружай данные полностью, а читай и обрабатывай по одной или по ограниченной пачке строк. Пригодятся понятия stream, generator, cursor, chunk.
Из описания непонятно почему тебе хочется сравнивать массивы/коллекции. Может быть и не надо?
Например нет смысла сравнивать некую запись со старой версией в таблице. Просто пиши новую версию.
Почитай про firstOrCreate / firstOrNew в Laravel. Если использовать возможности БД, то в MySQL есть такие чудесные операции как
* insert ignore
* insert on duplicate key update
* replace
которые позволяют работать с уникальными данными без ошибок в одну операцию.
Изменено artoodetoo (25.11.2020 07:38:49)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
P.S. Вообще когда с базой работаешь, надо отказываться от стереотипов работы с массивами. Очень неоптимально тащить всё в PHP. Вместо этого надо поручать тяжёлую работу серверу БД — он отлично справляется. База это намного более интелектуальная штука чем файл.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
P.S. Вообще когда с базой работаешь, надо отказываться от стереотипов работы с массивами. Очень неоптимально тащить всё в PHP. Вместо этого надо поручать тяжёлую работу серверу БД — он отлично справляется.
С этим можно похоливарить. По моему опыту как раз описанная задача (импорт прайс-листа на сайт) проще всего решается "в лоб" - загрузкой всех данных в память в начале и выгрузкой их в БД в конце - благо прайс загружается редко и даже когда это происходит - загружает только 1 клиент (без параллельной загрузки). Поэтому заморачиваться с курсорами, частичным обновлением, а то и хранимыми процедурами бессмысленно - программировать это на порядок сложнее, чем выделить пусть даже 150 Мб под один редкий запрос и манипулировать всем массивом данных в скрипте. Такой сценарий потянет даже дешевый VPS с 256 Мб RAM.
Не в сети
Страницы 1