23

我正在使用 JMS 序列化程序。我发现当我使用大数据时,性能真的很差。我将以下对象结构显示为数组:

$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,以便根据需要使用数据。

4

3 回答 3

2

不幸的是,这个库本来就很慢。里面有很多递归。

但是,您可以做的几件事是使用 Redis 或 Memcache 查询缓存所有内容。你也可以聪明地处理你的 SQL 查询,尽量减少脂肪。只为序列化程序提供您需要的重要数据,这样它就不会遍历大量无论如何都不会被使用的数据。

于 2015-01-19T12:04:39.880 回答
1

您是否使用部分响应?你的问题似乎很明显。在我看来,您的客户应该要求数量有限的物品,并在必要时要求更多......

于 2015-03-11T00:27:18.367 回答
1

我也遇到了同样的问题,“最佳解决方法”是为 Redis 中生成的 json 输出创建缓存,并在特定实体上插入 CRUD Doctrine 事件以刷新缓存。

一些帮助来自对引用集合的组和包含/排除规则的微调组合

于 2015-04-19T17:32:10.343 回答