2010-10-10 6 views
2

Je suis en train d'analyser un fichier XML contenant quelques milliers d'éléments pour l'insérer dans une base de données sql. Tout fonctionne très bien avec SQLite, mais postgres meurt sur moi avec cette erreur:Postgres - mémoire insuffisante sur l'insertion en boucle

PGError: ERROR: out of shared memory 

Je surveillais les verrous, et il semble qu'il y ait un verrou pour chaque instruction d'insertion, et bien que je suis juste en boucle sur activerecord « sauver "les appels (qui devraient avoir une transaction chacun) ces verrous semblent traîner de telle sorte que j'ai quelques milliers ouverts à la fois.

A titre d'expérience, j'Enveloppez la sauvegarde des appels dans une transaction:

Coupon.connection.transaction do 
    @coupon.save! 
end 

Et qui semble avoir résolu mon problème de serrures. Cependant, il semble que quelque chose ne va pas ici. Quelqu'un sait ce que c'est? J'utilise le pilote "pg".

Merci, Tom

+0

Avez-vous considéré Kettle pour la tâche? http://kettle.pentaho.com/ –

+0

avez-vous un journal de ce que SQL Rails génère? – peufeu

Répondre

1

Votre serveur peut simplement être mis en place pour utiliser uniquement une petite quantité de mémoire partagée - http://www.postgresql.org/docs/8.1/static/kernel-resources.html détails tout ce genre de choses très bien. Essayez d'élever cela pour les débutants. Cependant, quelques milliers d'éléments qui détruisent PostgreSQL semblent très bizarres: quelle est la taille des objets que vous stockez? À quoi ressemble votre code AR? Il n'y a pas beaucoup d'informations à donner ici.

+0

Les éléments sont assez petits ... environ 20 attributs, dont un seul est un type de données texte. Mon code AR est aussi simple, mais je ne suis pas sûr de ce que vous cherchez. Créez un coupon, attribuez quelques attributs, enregistrez. J'ai quelques validateurs, et pas de rappels avant/après. Je suis d'accord avec vous sur le fait qu'il est très étrange qu'une installation de stock de postgres nécessite un ajustement de l'évolutivité pour quelque chose que sqlite ne gère pas. De plus, mon code est super simple. Donc, c'est pourquoi je pense qu'il y a quelque chose d'AR/Rails/Driver-y qui se passe ici. –

Questions connexes