Diminuer la vitesse d'une boucle foreach

35558
,

Bonjour à tous,

Ca fait un petit moment que je me prends la tête sur la performance de mon code et notamment la vitesse d'exécution d'une boucle foreach.
J'ai un tableau de taille différente que je parcours dans le but de créer un autre tableau et afin d'insérer le nouveau tableau dans la BDD.
Le problème survient lorsque le tableau arrive à une taille supérieure à 5000 entrées.
Pour donner un ordre d'idée, la durée de la boucle foreach pour un tableau de 16000 entrées met environ 23 secondes à s'exécuter. Au sein de la boucle foreach, je fais 2 appels à la BDD. Chaque requête met moins de 0.001 seconde à s'exécuter. La requête d'insert met quant à elle 0.01 seconde.

Ce que je fais

Voici mon code, modifié car il s'agit d'un projet d'entreprise...

$bulkSize = 100;
$i = $j = 0;
foreach ($data['products'] as $product) {
    $actions[$j]['aze'] = [...];
    // première requête SQL
    $actions[$j]['qsd'] = [...];
    // seconde requête SQL
    $actions[$j]['qsd'] = \array_merge($actions[$j]['qsd'], [...]);
    $j++;
    if (($i % $bulkSize) === 0) {
        if (count($actions)) {
            // update BDD
            // si aucune erreur
            $actions = [];
            $j = 0;
        }
    }
    $i++;
}
if (count($actions)) {
    // update BDD
}

Ce que je veux

Ce que j'aimerais, c'est avoir un temps d'exécution réduit pour les tableaux avec de nombreuses entrées...
Avez-vous une idée de comment faire ?

Merci d'avance pour vos réponses !

2 Réponse

Default
,

En réfléchissant le soucie c'est le nombre de données, du coup si tu découpe ta data brut en chunck et peut etre regarder de ce coté la ou de ce coté la pour voir si tu peut paralléliser le traitement de tes chunck

35558
,

Salut !
J'ai déjà essayé en découpant ma data brut en chunks (taille 100). Malheureusement, j'ai toujours un temps d'exécution aussi important voire plus important.
Je pense que la classe parallel de PHP que tu me donnes comme exemple serait une bonne chose. Le problème, c'est que notre serveur tourne sous PHP 7.1.
Si je n'ai pas d'autres solutions, je vais essayer de mettre en place quelque chose qui ressemble à ceci