2
votes

boucle à travers 2 fichiers Json avec chaque 200k enregistrements en eux

J'ai 2 gros fichiers json avec chaque 200k objets et quand j'essaye de faire une boucle entre 2 jsons pour un identifiant commun, cela prend plus de temps pour l'exécution.

Implémentation 1

var activityData = {
  "data": [
    {
      "id":285568423,
      "type": "ExpenseEntry",
      "date": "2011-01-01",
      "quantity_in_hours": 1,
      "rounded_quantity_in_hours": 1,
      "quantity": 1,
      "rounded_quantity": 1,
      "price": 100,
      "matter": {
        "id": 1055395769
      }
      },
      {
      "id": 285568428,
      "type": "MonEntry", 
      "matter": {
        "id": 1055395769
      }
      },
      {
      "id": 285568442,
      "type": "EEntry", 
      "matter": {
        "id": 1055395769
      }}]
    };


Mise en œuvre 2

var matterData= {
  "data": [
    {
      "id": 1055395769,
      "description": "Peters",
      "status": "Pending",
      "location": null,
      "client_reference": "1532",
      "billable": true,
      "billing_method": "hourly",
      "open_date": "2019-06-05",
      "close_date": null,
}

]
};

Mise en œuvre 3

XXX

Chaque implémentation prend plus de temps à s'exécuter.

ActivitiesData aura un identifiant et aussi matière.id qui est lié à matièreData.id

Tout informations, veuillez aider

Données importantes

for (var i in matterData.data) {
  matters_array = [];

  for (var j in activityData.data) {
    if (activityData.data[j]["matter"] !== null) {
        if (matterData.data[i].id === activityData.data[j]["matter"].id) {
            matters_array.push(activityData.data[j]);
        }
        if (matters_array.length > 0) matterData.data[i]["activities"] = matters_array;
    }
  }
}

Données d'activités

for (var i in matterData.data) {
  //Activities
  matters_array = [];
  matters_array = activityData.data.filter(function (el) {
    if (el.matter !== null) return el.matter.id == matterData.data[i].id;
  });
  if (matters_array.length > 0) matterData.data[i]["activities"] = matters_array;
}


1 commentaires

Vous devrez peut-être commencer par trier le JSON par identifiant, même si je ne sais pas à quoi ressemble l'ID. Si l'ID est un nombre, une fois trié, utilisez un algorithme de recherche binaire. Quant à l'algorithme de tri, cela dépend de vous car il y a beaucoup d'options.


4 Réponses :


0
votes

Vous exécutez une boucle O (n ^ 2) qui représente près de 200 000 * 200 000 boucles. C'est un gros calcul à gérer. Vous pouvez réduire cette complexité en utilisant map. Stockez toutes les valeurs de activityData.data dans la carte avec l'ID. Et puis parcourez un matièreData.data pour vérifier si l'ID existe dans la carte.


0 commentaires

0
votes

Implémentation de la réponse avec ruhul

const map = Object.create(null);
const res = [];

// Store all values of matterData.data in map with id.
matterData.data.forEach(item => (map[item.id] = item));

//  iterate over one  activityData.data to check if the id exists in map.
activityData.data.forEach(item => {
  const { id } = item;
    if (map[id]) {
    res.push(item);
   }
});


1 commentaires

json mis à jour pour 2 objets .. Le code ci-dessus doit être modifié



1
votes

Commencez par créer une carte contenant id comme clé et matière.data comme valeur et créez un tableau vide pour l'activité, puis parcourez l'activité et poussez l'activité dans un tableau vide

const map = {}
for( var i in matterData.data){
  map[matterData.data[i].id] = matterData.data[i];
  matterData.data[i].activities = [];
}

for(var i in activityData.data){
 var matter = map[activityData.data[i].matter.id];
 matter.activities.push(activityData.data[i]);
}
for( var i in matterData.data){
  console.log(matterData.data[i]);
}

Cette solution fonctionne seulement si matièreData.data [i] .id est unique


0 commentaires

0
votes

Le Set.has est O (1) qui, je pense, peut être utilisé efficacement à cette fin.

var subSet = new Set(activityData.data.map(obj => {obj.matter.id}));


for (var i in matterData.data) {

  const  ma_array = [];
  if (subSet.has(matterData.data[i].id){

     ...
  }  

}


0 commentaires