Подтвердить что ты не робот

Проблема с производительностью сериализатора jms

Я использую JMS Serializer. И я узнал, что производительность очень плохая, когда я использую большие данные. Я представляю следующую структуру объектов как массив:

$jsonData = array(
    'message' => 'this is a nice message', 
    'data' => array(
        0 => array(
          'firstname' => 'achim',
          'lastname' => 'menzel' 
        )
    )
);

Вот как я сериализую данные:

$serializer = $this->get('serializer');
$encodedJson = $serializer->serialize($jsonData, 'json');

$response = new Response($encodedJson);
$response->headers->set('Content-Type', 'application/json');

Данные могут быть списком объектов 1 до n. Когда у меня более 500 объектов в данных, производительность очень медленная (более 5 секунд). Когда я использую json_encode() напрямую, это заняло не более 1 секунды.

Как я могу улучшить использование JMS Serializer? Я не думаю, что сериализатор jms не может обрабатывать большие данные.

Это основной класс, который будет использоваться для сериализации:

class JsonData {

  public $success = false;
  public $message = '';
  public $data;
  public $responseCode = 200;
  public $contentType = 'application/json';
}

И в настоящее время этот объект находится внутри $data:

class GuestDTO {

  private $userid;
  private $firstname;
  private $lastname;
  private $birthday;
  private $picturemedium;
  private $picturelarge;
  private $gender;
  private $modifydate;
  private $entries = array(); 
}

И $entries - это список объектов из этого класса:

class GuestlistentryDTO extends AbstractGuestDTO{

  private $guestlistentryid;
  private $guestlistid;
  private $arrivedat;
  private $bouncername;
  private $rejectionreason;
  private $companioncount;
  private $companioncountcheckin;    
  private $winner;
  private $vip;  
}

Без каких-либо аннотаций, потому что я подготовил свое dto для использования данных по мере необходимости.

4b9b3361

Ответ 1

К сожалению, эта библиотека по сути довольно медленная. Там много рекурсии.

Однако несколько вещей, которые вы можете сделать, - это кеш запросов, используя либо Redis, либо Memcache. Вы также можете быть умным с вашими SQL-запросами, попробуйте обрезать жир. Дайте сериализатору важные данные, которые вам нужны, чтобы не тратить много данных, которые в любом случае не будут использоваться.

Ответ 2

Вы используете частичные ответы? ваша проблема кажется совершенно очевидной. На мой взгляд, ваш клиент должен попросить ограниченное количество предметов и попросить больше, когда это необходимо...

Ответ 3

Я тоже попал в ту же проблему, и "лучшим решением" было создание кеша для сгенерированного json-вывода в Redis и включение событий CRUD Doctrine для определенных объектов, чтобы очистить кеш.

Некоторая помощь исходила из тонко настроенного сочетания групп и правил включения/исключения для ссылочных коллекций.