2009-11-26 5 views
0

J'ai un problème très difficile:Comment gérer la manipulation de base de données de masse à chaque seconde - enfilade?

je rondes sur 20-50 objets que je DOIS (qui est donné pour le problème, s'il vous plaît ne pas passer du temps dans la réflexion autour de lui) mettre througt une logique CHAQUE DEUXIÈME.

La logique elle-même besoin autour de 200-600 millisecondes (90%, il est 200ms - 10%, il est de 600ms).

J'essaie de trouver une solution que je peux faire est plus petit, mais il n'y en a pas. Je dois obtenir un objet de DB, je dois avoir beaucoup de if-else et je dois le faire. - Même si je le réduis à 50ms ou plus petit, au taux veriable de l'objet jusqu'à 50 va me casser le cou avec le timer 1 seconde, car 50 x 50mx = 2,5 seconde. Donc, une tique a besoin de plus de temps que le tickrate devrait être.

Donc, mon seul, pas très intelligent je pense, l'idée est d'ouvrir pour chaque objet un propre fil et de mener un thread principal pour la manipulation. Donc le thread principal ouvre x autre thread. Donc, seulement cette ouverture doit prendre moins d'une seconde. Après que la logique soit utilisée, le fil peut se tuer et nous sommes tous heureux, n'est-ce pas?


En raison des dernières réponses, je vais vous expliquer mon problème:

J'essaie de construire un site de commissaire-priseur. J'ai donc jusqu'à 50 ventes aux enchères en cours au même moment - rien de spécial. Donc, je dois: chaque seconde regarde la liste des enchères, voir si l'heure est 00:00:01 et si c'est le cas, enchérir automatiquement (c'est une fonctionnalité, cet utilisateur peut créer). Donc: obtenez 50 objets dans une liste, parcourez, vérifiez si une enchère automatique est nécessaire, faites-le.

+0

Vous n'avez pas besoin de faire défiler 50 articles; organisez la liste afin que vous connaissiez les écarts entre les heures de fermeture des enchères. Ensuite, regardez le devant de la liste et allez dormir jusqu'à 2 secondes après la fin de l'enchère. Ensuite, occupez-vous des un ou deux éléments qui doivent être traités en ce moment. –

+0

Je suis désolé, pouvez-vous l'expliquer un peu désaxé comme une réponse ou quelque chose? Je ne comprends pas le point. – Kovu

Répondre

3

Avec 50 objets et le temps de traitement que vous avez donné en moyenne, vous effectuez un traitement de 12 secondes par seconde. En supposant que vous ayez 4 cœurs, vous pouvez descendre jusqu'à un temps d'exécution de 4 secondes via le filetage. Chaque seconde. Cela signifie que vous allez commencer en arrière et glisser plus loin derrière au fil du temps. Je sais que vous avez dit que vous aviez essayé de trouver un moyen de le rendre plus efficace, mais que vous ne pouviez pas le faire, mais je crains que vous n'ayez à le faire. Le problème comme indiqué maintenant est informatiquement intraitable. Vous allez soit devoir traiter les objets dans une fenêtre en rotation (de sorte que chaque objet est frappé une fois tous les 4e cycles environ), soit vous devez accélérer le traitement.

+0

Ceci est un bon point - comprendre quelles ressources vous n'utilisez pas, et si vous et les utiliser pour aider votre problème. Si vous ne pouvez pas, alors vous êtes essentiellement malchanceux. Les fils, etc. ne répareront rien par magie. – Thanatos

+0

Threading peut aider avec le débit sur une machine multi-core ou multi-processeur, mais si c'est un seul noyau, vous pouvez en fait ralentir avec plus de threads. – Matt

+0

Voir mes modifications, peut-être il y a une autre solution – Kovu

2

Premier: Profil, si ce n'est déjà fait. Déterminez quelle section de votre code prend du temps, etc. J'irais après cette base de données - combien de temps les E/S des objets de la base de données prennent-elles? Pouvez-vous mettre en cache cette E/S? (Si vous manipulez les mêmes 50 objets, ne les chargez pas toutes les secondes.)

Abordons l'idée de vos threads: si vous voulez plusieurs threads, ne les créez pas et ne les détruisez pas toutes les secondes. Créez vos threads X, et laissez-les - créer & les détruire va être des opérations coûteuses. Vous constaterez peut-être que moins de threads fonctionneront mieux, par exemple 1 ou 2 par cœur, car vous pourrez peut-être réduire le temps nécessaire aux changements de contexte.

+0

+1 sur le profil d'abord, +1 sur ne pas frapper la DB à chaque itération, +1 sur ne pas créer/détruire les threads sur chaque objet, +1 sur pas trop de threads . .... maintenant, où est le bouton +4? bah, ce n'était pas un problème si intéressant de commencer, laisse le contourner à +1 – Javier

1

Pour développer le commentaire de Jonathan Leffler sur la question, comme l'OP a demandé: (Cette réponse est un wiki)

Supposons que vous avez ces trois choses étant vendus aux enchères, mettant fin aux heures indiquées:

10 Apples  - ends at 1:05:00 PM 
20 Blueberries - ends at 2:00:00 PM 
15 Pears  - ends at 3:50:00 PM 

Si l'heure actuelle est 13h00, puis dormez pendant 4 minutes, 58 secondes (puisque l'élément le plus proche se termine dans 5 minutes). Nous utilisons ensuite les 2 secondes pour le traitement - ajustez ce seuil si nécessaire. Une fois que nous en aurons fini avec les pommes, nous dormirons pour (2 PM - maintenant() - 2s), pour les myrtilles. Notez que lorsque nous nous levons à 13h04h58 pour traiter la vente aux enchères de pommes, nous ne touchons pas les bleuets ou les poires - nous savons qu'ils sont encore loin dans l'avenir, alors nous don ne t'inquiète pas.

+0

Bon, je pense qu'avec moins de temps c'est réalisable. Mais dans la réalité par moi non. J'ai des comptes à rebours de 15 secondes, 10-20 de ceux-ci, parce que si un enchérisseur fait une offre, la minuterie prend + 15 sec. Donc dans la "phase chaude" c'est très élevé – Kovu

+0

Si vous avez assez de temps pour faire les E/S nécessaires, alors vérifiez. Ensuite, vous pourriez découvrir que vous avez encore 15 secondes à attendre. S'il ne vous reste plus assez de temps pour vérifier, alors vous ne pouvez rien faire, n'est-ce pas? – Thanatos

Questions connexes