Сжатие потока - хорошо известная проблема, для которой был написан код лота (Thrust, Chagg для цитирования двух библиотек, которые реализуют сжатие потока на CUDA).
Если у вас есть относительно новое устройство с поддержкой CUDA, которое поддерживает внутреннюю функцию как __ballot (compute cdapability> = 3.0), стоит попробовать небольшую процедуру CUDA, которая выполняет сжатие потока намного быстрее, чем Thrust.
Здесь находит код и минимальный документ. https://github.com/knotman90/cuStreamComp
Использует функцию голосования в одиночном режиме для выполнения уплотнения.
Ваша база данных усложняет работу. Я думаю, вы можете использовать динамические свойства, если хотите сделать ее доступной в usermodel
Модели User < - - (Многие ко многим) -> Уровни < - - ( Много ко многим)
protected $appends = ['skills_levels'];
public function getSkillsLevelsAttribute()
{
$skills = // query to get all skills ->pluck('skill','id');
$this->load('levels.skills')
$levels = $this->levels->groupBy('skills.skill_id')->toarray();
$output = [];
foreach ($skills as $id => $skill) {
$output[$skill] = [];
if (isset($levels[$id])) {
$output[$skill] = $levels[$id] // all levels user have for this skill
}
}
return $output
}