2013-03-09 2 views
0

J'ai une fonction qui stocke une grande quantité de données, puis vérifier ces données pour les doublons avant de stocker plus. En interrogeant la base de données pour chaque vérification de doublons, le script dépasse le temps d'exécution maximal, interrogeant ainsi la totalité de la base de données, puis vérifiant simplement par rapport à cette requête. Le problème est que lorsque je parcours la copie, la taille de la requête diminue à zéro au 4ème passage, ce qui la rend inefficace. Voici le code de la fonction de stockage et la vérification en double:ScriptDb diminution de la requête

function ssToScriptDb_1() { 
    var spreadsheet = SpreadsheetApp.openById('0Ah1c1zmu5vU_dEZJYVMzVnF6Y211cmJGdjZBUGFLQWc'); // **** create a function to prompt for the ID 
    var sheet = spreadsheet.getActiveSheet(); 
    var columns = spreadsheet.getLastColumn(); 
    var data = sheet.getDataRange().getValues(); 
    var keys = data[0]; 
    var db = ScriptDb.getMyDb(); 
    var allDb = db.query({}); 
    var items = []; 
    for (var row = 1; row < data.length; row++) { 
    var rowData = data[row]; 
    var item = {}; 
    for (var column = 0; column < keys.length; column++) { 
     item[keys[column]] = rowData[column]; // ???? could I use this notation in place of the double for loops in timeClock? 
    } 
    item.visitDate = Utilities.formatDate(item.visitDate, "MST", "M/d/yyyy"); 

    // check to see if the item is already in the db 
    if (dupCheck(db, allDb, item)) { 
     items.push(item); 
    } 
    if (row % 1000 == 0) { 
     Logger.log("row " + row + " completed at " + new Date() +"\n"); 
    } 
    } 

    var itemsLen = items.length; 
    Logger.log('DB save start time ' + new Date() + '\n'); 
    var results = db.saveBatch(items, false); 
    Logger.log('DB save end time ' + new Date() + '\n'); 
} 

function dupCheck(db, query, item) { 
    var count = 0; 
    var querySize = query.getSize(); 
    var query2Size = db.query({}).getSize(); 
    while (query.hasNext()) { 
    var ob = query.next(); 
    if (ob.ID == item.ID && ob.email == item.email && ob.visitDate == item.visitDate) { 
     return false; 
    } 
    count++; 
    } 
    return true; 
} 

la première passe par dupCheck() en debug ressemble à ceci: dupCheck() pass 1

avis que querySize est la requête faite avant d'entrer dans dupCheck() et query2Size est la même requête effectuée à l'intérieur dupCheck().

ici est la seconde passe par dupCheck(): dupCheck() pass 2

ici est la 4ème passe: dupCheck() pass 4

à nouveau remarqué querySize vs query2Size.

Je n'ai aucune idée de ce qui cause la requête originale à diminuer mais je ne peux pas appeler une requête pour chaque élément, aucune idée de ce qui cause ou avoir une meilleure solution?

Répondre

0

Je l'ai compris. Je n'ai pas réalisé que query.next() modifiait la requête. Pour obtenir ce dont j'avais besoin, j'ai placé les résultats de la requête dans un tableau et vérifié les doublons par rapport au tableau.

Questions connexes