Question

Hé communauté stackoverflow!

Je rencontre un problème lorsqu'un programme algorithmique très impliqué utilise l'utilisation de cpu de TOO LITTLE: entre 3 et 4%. Il faut beaucoup de temps pour obtenir des résultats, et je pense que cela ne fonctionne tout simplement pas assez fort.

Certains de vos génies ont-ils une idée de la raison pour laquelle cela se produirait? Si tel était le cas, j'attendrais une utilisation à 100%. Un détail supplémentaire est que le programme fait des insertions dans une base de données sqlite3, et donc oui, il y a beaucoup d'appels JNI via la bibliothèque sqlite3jdbc, je crois. (Notez que je souhaitais différer ces insertions avec un lot PreparedQuery plus tôt, mais cela posait de gros problèmes de mémoire - il y avait beaucoup de données).

Merci d'avance

UPDATE: corrigé. Oui, je ne faisais que du doofus, mais je ne m'attendais pas à ce que sqlite commence une nouvelle transaction et fasse autant de frais généraux.

J'utilise maintenant PreparedStatement et la file d'attente 32 768 entrées avant insertion - me semblait un nombre suffisant.

Était-ce utile?

La solution

Évidemment, les appels à la base de données sont à l’origine de retards. N'est-ce pas une option pour créer des lots plus petits et tester si cela aide? Peut-être pourriez-vous également paralléliser l'algorithme pour avoir une file d'attente quelque part prenant les résultats et un autre thread nettoyant cette file d'attente?

modifier:

Il existe également d'autres problèmes:

  • Optimisation de la base de données (modèle)
  • Configuration du serveur de base de données
  • vitesse du disque

Tous ces facteurs doivent être pris en compte

Autres conseils

Je ne recommanderais jamais à quiconque d'utiliser un pilote JDBC avec JNI si une version de type IV, 100% Java, est disponible. Google a trouvé celui-ci .

Ceci mis à part, je ne peux rien dire sans plus d'infos. L'application et la base de données fonctionnent-elles sur le même matériel?

Ce qui est tellement "intensif" à propos des INSERT?

Je recommanderais de profiler et d’obtenir de vraies données plutôt que de deviner. L'informatique basée sur la foi ne fonctionne jamais pour moi.

Si vous écrivez beaucoup de données, il semble que vous soyez lié au disque. Examinez les statistiques de votre disque sur la machine et, s’il s’agit là d’un goulet d’étranglement, recherchez du matériel avec une meilleure qualité ou trouvez des solutions pour réduire les écritures.

Le disque ralentit votre application. INSERTS utilise le disque, celui-ci est lent et le système d'exploitation doit attendre la fin des opérations d'écriture.

Ne pouvez-vous pas utiliser 2 threads, un pour l’algorithme et un autre pour les insertions? Si vous ne faites que des insertions, vous pouvez également écrire ensuite dans un fichier texte et les exécuter plus tard

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top