我正在使用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。
答案 0 :(得分:2)
不幸的是,这个库本来就很慢。那里有很多递归。
然而,您可以做的一些事情是使用Redis或Memcache查询缓存所有内容。你也可以聪明地使用SQL查询,尝试削减脂肪。只给序列化程序提供您需要的重要数据,这样它就不会拖曳大量的数据,而这些数据无论如何都不会被使用。
答案 1 :(得分:1)
您使用的是部分回复吗?你的问题似乎很明显。在我看来,您的客户应该询问有限数量的物品,并在必要时要求更多......
答案 2 :(得分:1)
我也遇到了同样的问题,“最佳解决方法”是在Redis中为生成的json输出创建缓存,并在特定实体上插入CRUD Doctrine事件以刷新缓存。
一些帮助来自精心调整的群组和参考馆藏的包含/排除规则