Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 24.11.2020 19:08:49

Как лучше сравнивать два массива (коллекции)?

Здравствуйте.
Имеется задача импортировать прайс лист Excel или из текстового файла, выбирать отдельные столбцы
и апдейтить соответствующие столбцы в базе.
Затем выбирать некоторые столбцы из импортированного прайса и из базы, и формировать новый
Как это лучше сделать, поместяться ли два три таких массива по 150 Мб в памяти ?
Можно отключить лимит памяти в php.ini, но это дома, а на хостинге будет ППЦ...

Не в сети

#2 25.11.2020 07:30:27

Re: Как лучше сравнивать два массива (коллекции)?

Готовый код не дам, только наводки.

Если хочется экономить память, не загружай данные полностью, а читай и обрабатывай по одной или по ограниченной пачке строк. Пригодятся понятия 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.

Не в сети

#3 25.11.2020 07:59:04

Re: Как лучше сравнивать два массива (коллекции)?

P.S. Вообще когда с базой работаешь, надо отказываться от стереотипов работы с массивами. Очень неоптимально тащить всё в PHP. Вместо этого надо поручать тяжёлую работу серверу БД — он отлично справляется. База это намного более интелектуальная штука чем файл.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 26.11.2020 19:58:59

Re: Как лучше сравнивать два массива (коллекции)?

P.S. Вообще когда с базой работаешь, надо отказываться от стереотипов работы с массивами. Очень неоптимально тащить всё в PHP. Вместо этого надо поручать тяжёлую работу серверу БД — он отлично справляется.

С этим можно похоливарить. По моему опыту как раз описанная задача (импорт прайс-листа на сайт) проще всего решается "в лоб" - загрузкой всех данных в память в начале и выгрузкой их в БД в конце - благо прайс загружается редко и даже когда это происходит - загружает только 1 клиент (без параллельной загрузки). Поэтому заморачиваться с курсорами, частичным обновлением, а то и хранимыми процедурами бессмысленно - программировать это на порядок сложнее, чем выделить пусть даже 150 Мб под один редкий запрос и манипулировать всем массивом данных в скрипте. Такой сценарий потянет даже дешевый VPS с 256 Мб RAM.

Не в сети

Подвал раздела