2013-05-24 40 views
22

Używam Serializera JMS. I dowiedziałem się, że wydajność jest naprawdę zła, gdy używam dużych danych. Mam następującą strukturę obiektu wyświetlanego jako tablica:jms serializer Wydajność wydania

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

to jak ja serializacji danych:

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

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

dane mogą być lista 1 till n obiektów. Kiedy mam więcej niż 500 obiektów w danych, wydajność jest bardzo powolna (ponad 5sek.). Kiedy używam bezpośrednio json_encode(), to nie jest to więcej niż 1 sekunda.

Jak mogę poprawić wykorzystanie JMS Serializer? Nie sądzę, że serializator jms nie poradzi sobie z dużymi danymi.

Jest to główne klasy, które będą wykorzystywane do szeregowania:

class JsonData { 

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

a obecnie obiekt ten znajduje się wewnątrz $data:

class GuestDTO { 

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

I $entries jest lista obiektów z tej klasy:

class GuestlistentryDTO extends AbstractGuestDTO{ 

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

Bez żadnych annotati ons, ponieważ przygotowałem moje dto do korzystania z danych, jak potrzebuję.

+2

Czy próbowałeś kontroli, które części JMSSerializer spowalnia całą sprawę z xhprof lub XDebug i cachegrind/kcachegrind/webgrind? Czy masz włączoną funkcję serializacji z serializatorem JMS - podobnie jak wartości filtrowania lub pola wirtualne? – nifr

+0

Dowiedziałem się tylko, że serializator jms jest częścią, która spowalnia żądanie. Nie ustawiam żadnych ustawień ani adnotacji, ponieważ używam obiektów DTO, które mają odpowiednie atrybuty, czego potrzebuję, więc nie muszę ustawiać żadnych ustawień. –

+0

możesz szybko podać swój podmiot, aby móc przekazać opinię na temat wpływu na wydajność tutaj? – nifr

Odpowiedz

2

Niestety ta biblioteka jest z natury dość powolna. Tam jest dużo rekursji.

Kilka rzeczy, które możesz zrobić, to cacheowanie zapytań przy użyciu Redis lub Memcache. Możesz także być inteligentnym dzięki zapytaniom SQL, spróbować przyciąć tłuszcz. Przekaż serializatorowi tylko te ważne dane, których potrzebujesz, aby nie trałował on wielu danych, które i tak nie zostaną wykorzystane.

1

Czy używasz częściowych odpowiedzi? twój problem wydaje się całkiem oczywisty. Moim zdaniem Twój klient powinien poprosić o ograniczoną liczbę pozycji i poprosić o więcej, gdy to konieczne ...

1

Trafiłem też na ten sam problem, a "najlepszym obejściem" było utworzenie pamięci podręcznej dla wygenerowanego json'a wyjście w Redis i podłącz zdarzenia CRUD Doctrine do konkretnych obiektów, aby opróżnić pamięć podręczną.

Niektóre pomoc przyszła od dopracowany mix grup i zasad włączenia/wyłączenia dla zbiorów referencyjnych