2009-04-25 8 views
1

Mon application stocke les données de localisation à partir des entrées GPS. Lors de l'importation d'un fichier GPX, un utilisateur peut disposer de 500 à 10 000 points de données GPS. En ce moment, j'ai un modèle pour chaque trackpoint. Ca marche super bien, mais sur insert c'est SLOW. 30+ secondes pour les 10 000 points de données. Y a-t-il un meilleur moyen d'insertion en vrac?Création accélérée/en masse activeecord

Tout le temps est passé du côté SQL - chaque insertion est rapide, mais 10 000 s'additionnent rapidement. Chaque utilisateur peut avoir 100 fichiers et 100 utilisateurs == longs temps d'insertion longs. Pas tout à la fois bien sûr.

Je serais heureux de changer l'architecture de l'application si cela pouvait aider, mais je ne sais pas quelles sont les alternatives que j'ai ici. Je n'utilise que les données GPS en tant qu'unité. Je ne recherche jamais un enregistrement dans l'ensemble, donc l'ensemble ActiveRecord est exagéré.

Je détesterais devoir faire un système entier de file d'attente juste pour manipuler cette insertion idiote.

Répondre

0

Vous avez réfléchi à cela et vous avez l'impression que mes deux options consistent à sérialiser un hachage dans un objet BLOB ou à le stocker ailleurs. Je n'ai pas d'accès FS, mais je pourrais utiliser S3.

Donc je suppose que j'ai changé ma question. Pour stocker des objets 100kb qui sont à peu près en lecture seule après la création, tout retour sur les principes généraux de stockage S3 vs blob? Je pense que this thread couvre probablement ce que je cherche pour le moment!

2

Utilisez la méthode d'importation ar-extensions pour les importer à la fois: http://github.com/zdennis/ar-extensions/blob/master/ar-extensions/lib/ar-extensions/import.rb#L49-215

Le problème est que si vous importez chaque enregistrement en faisant une #save, vous créez en fait une instruction d'insertion par ligne, et appelant tous des validations de votre modèle. Vous pouvez à la place construire une instruction d'insertion sql plus grande qui pousse toutes les données en même temps.

Questions connexes