2015-04-01 3 views
0

J'interroge une base de données SQLite pour des messages dans des intervalles d'une heure, où je suis intéressé par une entrée pr userid pr hour (ceci est maintenant fait avec succès avec la clause GROUP BY). Pour interroger la base de données pour chaque intervalle horaire prend un temps assez long, je pensais que je gagnerais du temps si je ne demandais qu'une seule fois la base de données sans aucun intervalle de temps, puis manipulais le tableau résultant en morceaux de taille heure. Et accomplissant ainsi la même chose que ma méthode originale. Mais comment puis-je faire cela?Comment faire un équivalent de GROUP BY en python

for k in range(0,3000): 
    start = 1398942000+k*60*60 
    end = 1398942000+(k+1)*60*60 
    cur.execute('SELECT userid, unixtime, latitude, longitude FROM table WHERE unixtime > {start} AND unixtime < {end} GROUP BY userid'.format(start = start, end = end)) 

Ceci est ma requête telle qu'elle est maintenant. Cela fonctionne bien, mais prend beaucoup de temps. Idéalement, il ressemblerait à ceci:

cur.execute('SELECT userid, unixtime latitude, longitude FROM message') 

Puis

* list = fetchall bla bla bla* 
for k in range(0,137*24): 
    start = 1398942000+k*60*60 
    end = 1398942000+(k+1)*60*60 
    thisHourInterval = list[:indextoClosestUnixTimeToEnd] 
    list = list[indextoClosestUnixTimeToEnd:] 
    *Only one entry pr id in thisHourInterval* 

Ou je me trompe quand je pense que ce sera une solution plus rapide? La quantité de données est assez grande, probablement> 4gig.

Pour être clair - je sais comment obtenir les données de la base de données, mais je suis à la recherche d'un python équivalent de groupe BY et où unixtime> début et unixtime < fin

Répondre

0

Avez-vous essayé « GROUP BY 'par opposition à' grouper par 'dans votre requête initiale?

Vous devriez être en mesure d'utiliser toute la largeur de sql dans ces wrappers.

Si vous voulez manipuler les données dans Python, vous devez obtenir les données en mémoire en python.

+0

Merci d'avoir signalé mon erreur de formatage. Oui, j'utilise GROUP BY et cela fonctionne très bien, mais je préfère mettre tout le jeu de données en mémoire et y travailler, plutôt que d'interroger la base de données SQLite autant de fois - mais peut-être que l'interrogation est la plus rapide? – bjornasm

0
cur.execute('SELECT userid, unixtime, latitude, longitude FROM table WHERE 1=1') 
d = {} 
for line in cur.iterdump(): 
    index=(line[1]-1398942000)%3600 # line[1] might want to be line['unixtime'] 
    if((index in d) == False): 
     d[index] = [] 
    d[index].append(line) 

Vous ne vous êtes pas amusé?

+0

Merci pour votre effort, désolé si je n'étais pas clair, mais je ne sais pas comment je "ferais quelque chose à chaque ligne" pour accomplir la même chose que "group by" et "où unixtime> start et unixtime bjornasm