2009-09-10 9 views
0

Je dois créer environ 100 000 enregistrements. Ces enregistrements se trouvent dans le fichier csv et sont chargés à l'aide de la fonction create_fixtures. C'est lent sur ma machine de développement mais ça se termine. Le problème commence à la production où nous avons des limites de mémoire par processus qui conduit à tuer le processus de râteau. Je pense que c'est parce que create_fixtures importe toutes les données en mémoire. Est-ce que quelqu'un sait comment le forcer à importer des morceaux plus petits (avant de couper un grand csv en quelques plus petits).Ruby on rails: problème de mémoire create_fixtures

Répondre

0

Comment charger/analyser le fichier CSV? Je pense que j'utiliserais les utilitaires de Ruby pour ouvrir et lire et analyser chaque ligne moi-même.

1

Ne le faites pas! Create_fixtures est conçu pour charger des données de test, qui doivent être aussi grandes que nécessaire pour exercer une fonction. C'est pas destiné à charger des milliers d'enregistrements sur une base de données de production (ou tout autre type). Si c'est un one-off alors peut-être OK, mais comme une chose régulière, je serais très nerveux.

Si vos données est assez simple, je veux dire un String#split simple, cela fonctionnerait, cela devrait probablement être votre approche, quelque chose comme

File.foreach(csv_file_path) do |line| 
    fields = line.split(/,/) 
    # create records from the array of fields 
end 

Sinon (vous pouvez avoir des valeurs de chaîne avec des guillemets ou des virgules , les valeurs de champ manquantes ou plusieurs formats d'enregistrement, ce genre de chose), vous devriez probablement regarder le CSV library, qui fait déjà partie de l'installation Ruby 1.8.6, ou mieux encore, regardez le FasterCSV Gem, qui remplace CSV à partir de 1.9.

MISE À JOUR: Jouissant d'une Bates Ryan juste posted a screencast sur le sujet vexatoire des données de semences ...

+0

Je comprends que c'est une mauvaise pratique pour charger les appareils en production (pas validateurs par exemple), pour certaines données (comme les pays/villes/etc ...) c'est une nécessité. J'ai trouvé une bonne discussion ici: http://railspikes.com/2008/2/1/loading-seed-data (en ne regardant pas le problème de la mémoire de l'appareil, mais la façon dont les gens gèrent la production de semences.) –

+0

Peut-être que je lis un autre partie. Je vois cela "Je n'aime pas les appareils parce qu'ils ne valident pas les données". Les commentaires à ce poste mentionnent ar-extensions, ce qui est utile si la vitesse d'écriture en bloc de DB est un problème. Je ne suis pas en train de chipoter avec le besoin de données sur les semences (c'est tout ce que vous essayez de faire - la question n'est pas claire), je pense juste que vous feriez mieux d'arrêter d'utiliser le chargement des appareils pour quelque chose. il n'a pas été conçu pour. –