Bonjour,

Nous sommes en train de crééer un batch d'import de données depuis un fichier excel.
Nous l’exécutons en tant que commande.

En gros, ce batch fais les opérations suivantes :
récupération du contenu du fichier excel dans un tableau (peu gourmand en mémoire)
pour chaque ligne de ce tableau{
on regarde si on l'a déjà en base(très gourmand 5MB)
si non, on créé l'objet
on modifie quelques valeurs de l'objet
on le met a jour, on persist
tous les 20 enregistrement ou pour le dernière occurrence, on flush et clear l'entité manager.
}
Jusque là, ca devrait bien fonctionner... sauf que le système est ultra lent, et qu'on encrasse la mémoire progressivement avec des données que l'on utilise surement plus.

Est-ce que vous voyez quelque chose à mettre en place pour que ca fonctionne mieux ?
Merci,
Pierre

Le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
private function importOceaneTicket($exports_path, $export_date, $em) {
       echo __FUNCTION__ ;
 
        $batchsize = 20;
        $xls = new Reader($exports_path . $export_date . "/00_tbl_tickets.xls");
        $c = $xls->rowcount();
        for ($row = 2; $row <= $c; $row++) {
            $ticketid = utf8_encode($xls->val($row, 1));
            $Status = utf8_encode($xls->val($row, 2));
            $InitiatorGroupID = utf8_encode($xls->val($row, 3));
            $InitiatorGroupname = utf8_encode($xls->val($row, 4));
            $InitiatorCountry = utf8_encode($xls->val($row, 5));
            $InitiatorUserName = utf8_encode($xls->val($row, 6));
            $Product_type = utf8_encode($xls->val($row, 7));
            $Identifier_1 = utf8_encode($xls->val($row, 8));
            $Identifier_2 = utf8_encode($xls->val($row, 9));
            $Identifier_3 = utf8_encode($xls->val($row, 10));
            $Monitored_reference = utf8_encode($xls->val($row, 11));
            $Last_user = utf8_encode($xls->val($row, 12));
 
            $ticket = $this->checkDolphinTicket($em, $ticketid);//here is the issue
 
            //update with oceane field
            $datanow = new DateTime('now');
            $datanow->format('d-m-Y H:i:s');
            $ticket->setUpdateDate($datanow);
            $ticket->setOceaneStatus($Status);
            $ticket->setOceaneInitiatorGroupId($InitiatorGroupID);
            $ticket->setOceaneInitiatorGroupName($InitiatorGroupname);
            $ticket->setOceaneInitiatorCountry($InitiatorCountry);
            $ticket->setOceaneInitiatorUsername($InitiatorUserName);
            $ticket->setOceaneProductType($Product_type);
            $ticket->setOceaneIdentifier1($Identifier_1);
            $ticket->setOceaneIdentifier1($Identifier_2);
            $ticket->setOceaneIdentifier1($Identifier_3);
            $ticket->setOceaneMonitoredReference($Monitored_reference);
            $ticket->setOceaneLastUser($Last_user);
            $em->persist($ticket);
            if (($row % $batchsize) == 0) {
                $em->flush();
                $em->clear();
            }
            unset($ticket);
        }
        $em->flush();
        $em->clear();
        unset($c);
        unset($xls);
    }
And the code of the function checkDolphinTicket :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
private function checkDolphinTicket($em, $id) {
        $dolphin_ticket = $em->getRepository('ToolBundle:Ticket')->findOneBy(array('sspo_tid' => $id));
        if ($dolphin_ticket == null) {
            $dolphin_ticket = $this->insertTicket($em, $id);
        } else {
            $current_status = $dolphin_ticket->getStatus();
            if ($current_status == '3') {
                $dolphin_ticket->setStatus('0');
            }
        }
        return $dolphin_ticket;
    }