Quel type de connexion à la base de données utilisez-vous? Certaines bases de données vous permettent de vous connecter «directement» plutôt que d'utiliser une connexion réseau TCP qui traverse la pile réseau. En d'autres termes, si vous établissez une connexion Internet et envoyez des données de cette manière, cela peut ralentir les choses.
Une autre façon d'améliorer les performances d'une connexion de base de données consiste à regrouper les instructions SQL en une seule commande.
Par exemple, faire une seule ligne 6000 instruction SQL qui ressemble à ceci
"update words set count = count + 1 where word = 'the'
update words set count = count + 1 where word = 'in'
...
update words set count = count + 1 where word = 'copacetic'"
et exécuter que comme une seule commande, la performance sera beaucoup mieux. Par défaut, MySQL a une limite de 'taille de paquet' de 1 mégaoctet, mais vous pouvez changer cela dans le fichier my.ini pour être plus grand si vous voulez. Comme vous supprimez vos appels de base de données via ActiveRecord, vous n'avez pas beaucoup de contrôle sur la façon dont les commandes sont émises. Il peut donc être difficile d'optimiser votre code.
Autre pourrait serait de garder un nombre de mots en mémoire, puis seulement insérer le total final dans la base de données, plutôt que de faire une mise à jour chaque fois que vous rencontrez un mot. Cela réduira probablement beaucoup le nombre d'insertions, parce que si vous faites une mise à jour chaque fois que vous rencontrez le mot «le», c'est un énorme, énorme gâchis. Les mots ont une distribution «longue queue» et les mots les plus courants sont énormément plus communs que les mots plus obscurs. Ensuite, le SQL sous-jacente ressemblerait plus à ceci:
"update words set count = 300 where word = 'the'
update words set count = 250 where word = 'in'
...
update words set count = 1 where word = 'copacetic'"
Si vous êtes inquiet au sujet de prendre trop de mémoire, vous pouvez compter les mots et périodiquement les « flush ». Lisez donc quelques mégaoctets de texte, puis passez quelques secondes à mettre à jour les totaux, plutôt que de mettre à jour chaque mot chaque fois que vous le rencontrez. Si vous souhaitez améliorer les performances encore plus, vous devriez envisager d'émettre des commandes SQL par lots directement
même en écrivant tous les enregistrements à la fin, il frappe la base de données 6000 fois ... et a pris un certain temps. Je pensais à plus de 10, 15 secondes maximum. Si j'écris toutes les données dans un fichier plat, cela ne devrait prendre que 1 ou 2 secondes. ne puis-je désactiver sqlite3 pour ne pas "forcer l'écriture" sur la base de données à chaque fois, mais l'écrire une fois après tout l'insertion d'enregistrements? –
regardez ma réponse, en utilisant l'encart en vrac devrait l'accélérer. –