2017-10-17 5 views
0

J'ai un tableau 2d représentant des lignes dans une base de données. J'utilise officeJS pour charger et manipuler les données dans Excel. Je mets à jour, insère et supprime des lignes. Le défi auquel je suis confronté est que j'ai besoin de comprendre les lignes modifiées (insérées, supprimées ou mises à jour) afin que je puisse mettre à jour seulement ces lignes dans la base de données. J'envoie une requête pour les lignes mises à jour et insérées et une requête pour les lignes supprimées. Je suis capable de le faire en utilisant lodash pour les données avec 5000 lignes et 10 colonnes. Je voudrais adapter cela à un ensemble de données beaucoup plus grand et je me demande s'il y a des alternatives à ce que je fais actuellement. Voici le code que j'utilise pour trouver la différence.Comparaison de tableaux Lodash 2d pour les grands ensembles de données

insertedOrUpdatedRows = _.differenceWith(modifiedData, originalData, _.isEqual); 

deletedRows = _.differenceWith(originalData, modifiedData, compareFunction); 

function compareFunction(a, b) { 
    if(a[0] == b[0]) { 
     return true; 
    } 
    else 
     return false; 
} 

tableau de données d'échantillon

[[1, données, données, données], [2, des données, des données, des données]]

Le premier élément est la clé primaire.

+0

Cela semble être une méthode assez décente. – nikjohn

+0

Oui, il échoue pour un jeu de données plus volumineux que 5000 lignes et 10 colonnes. Y a-t-il un moyen de traiter plus de données? Peut-être plonger les données dans des morceaux? –

+0

échoue car dans lodash plante. –

Répondre

0

Parce que vous avez mentionné que votre moteur Javascript se bloque (ce qui ne devrait pas, à 50.000 lignes - donc je revoir la logique), je recommande Chunking les données en utilisant la fonction _.chunk de Lodash:

_.chunk(modifiedData, modifiedData.length/500).map({ 
    ... 
    ... 
}); 
+1

Ok, je devrais ajouter que je teste avec 10 colonnes au lieu de 4 comme montré dans le tableau ci-dessus. overhead sur lodash Une autre approche a consisté à stringifier chacune des lignes avant d'appeler la différence afin qu'elle puisse traiter la ligne entière comme un élément.Elle fonctionne pour 20 000 enregistrements, puis le navigateur addin d'Excel tombe en panne. et donnez une mise à jour Merci pour l'aide! –

0

Ok im en utilisant la logique suivante. Je ne sais pas pourquoi il s'écrase à 50K lignes. OriginalData et ModifiedData sont au format de l'exemple de tableau 2D mentionné ci-dessus.

var originalDataStrings = []; 
var modifiedDataStrings = []; 
var insertedOrUpdatedRows; 

originalData.forEach(function(row){ 
    originalDataStrings.push(JSON.stringify(row)); 
}); 

modifiedData.forEach(function(row){ 
    modifiedDataStrings.push(JSON.stringify(row)); 
}) 

insertedOrUpdatedRows = _.differenceWith(modifiedDataStrings, originalDataStrings, _.isEqual); 
console.log(insertedOrUpdatedRows);