moraks
@moraks

Как переиндексировать часть массива PHP?

Ребята, есть задача на оптимизацию работы php с большими данными. Думаю, обсуждение будет полезным.
Суть задачи: есть данные 24GB, над данными производится большое число операций, данные разрезаны на 8 массивов (для параллельной обработки) и содержатся в оперативной памяти сервера. Итого мы имеем один массив весом около 3GB и числом элементов около 100000 , из-за обработки некоторые элементы массива удаляются (90500, 90501, "delele_key", 90503 ). Но важен порядок ключей массива и сохранение вертикального порядка значений. То есть при удалении значения, массив нужно переиндексировать как функцией array_values(). Но эта функция не имеет никаких настраиваемых параметров и пересчитывает (обрабатывает) весь массив, даже если удалилось 99996 значение из 100000. Сервер физически подвисает. Что можно придумать, чтобы переидексировать только часть элементов массива находящихся правее на числовой прямой. В моем примере только с 99996 по 100000, т.е. затронуть только 4 элемента?
  • Вопрос задан
  • 1148 просмотров
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
Давно уже все придумано - СУБД. И не засовывать в оперативку по 3gb.
Ответ написан
moraks
@moraks Автор вопроса
Базы данных есть конечно - одна из баз "горячая" на ssd, данные в php массиве очень динамично используются именно php, производится постоянное редактирование и использование. В базу данных складываются уже обработанные и структурированные данные. С базой данной работают уже непосредственно рабочие процессы. Опишу структуру и характер данных на простом примере: представим себе ситуацию когда нам принесли 50 кг перемешанной крупы (рис, гречка, перловка, ячка, пшено и гравий(удаляемый мусор)). У нас есть шкафчик с контейнерами для каждого вида круп - это !база данных!, из этого шкафчика в настоящий момент уже разбирают остатки круп для приготовления еды. Из шкафчика брать крупы очень удобно и быстро, так как всё на своем месте и подписано. Логично ли будет добавить в шкафчик 50 кг смеси и затормозить рабочие процессы? Нет. Нам нужно высыпать на пол мешок смеси и применять к нему инструменты для сортировки, а отсортированное раскладывать по контейнерам для дальнейшего использования. Но, бывают случаи когда крупы плохо перемешаны или их всего два вида - тогда не логично отсеивать все 50 кг, а можно отделить фрагмент с ненужным мусором, отсеить его. Когда мы отсеиваем, получается 2 кучи нужного продукта - большая и маленькая. Сейчас мы пытаемся перед отправкой в шкафчик взвесить обе кучи, а нужно только маленькую. Желательно бы вес большой вычислить как = общий вес (50кг)- вес малой кучки - вес мусора. Но array_values() взвешивает всё... Как-то так...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы