2012-01-31 6 views
1

J'ai besoin d'une méthode rapide pour mettre à jour des données de type clé/valeur ou bien une quantité arbitraire de "compteurs" à l'échelle du système sous Linux. Les systèmes en question sont Ubuntu 10.04, RHEL 4.8 et RHEL 5.x. Maintenant, je suis conscient de memcached, mais il semble être plus adapté pour les processus de longue durée, tels que les processus FastCGI. Malheureusement, mon processus est un CGI traditionnel et doit donc utiliser un stockage persistant en dehors du processus lui-même.Compteur global système pouvant être mis à jour par programmation (sur différentes versions de Linux)?

Quelles options ai-je et lesquelles sont les plus faciles et moins cher (temps d'exécution w.r.t.) pour accéder à partir de C/C++? Remarque: il ne s'agit pas de mesurer la vitesse (c'est-à-dire les compteurs de performance), mais de mesurer le nombre d'événements d'un certain type. Et pour pouvoir compter de façon fiable, je dois être en mesure d'incrémenter les compteurs à volonté ...

Répondre

1

Vous pouvez utiliser une simple base de données similaire à DBM, par exemple GDBM.

+0

Merci. La documentation abotu GDBM ne fait cependant pas mention de l'atomicité. Alors, comment cela se comportera-t-il avec des instances CGI simultanées essayant de remonter le même compteur? Qu'en est-il de l'ACID? – 0xC0000022L

+0

@STATUS_ACCESS_DENIED Vérifiez les autres bases de données dans l'article Wikipedia. Certains d'entre eux ont une atomicité et/ou une manipulation de l'ACIDE. Je pense que la plupart des DBM sont beaucoup plus légers que les bases de données modernes "NoSQL" qu'ils ont inspirées. –

+0

merci, vous avez raison VSDB semble prometteur. – 0xC0000022L

1

Vous pouvez essayer une petite base de données SQLite. SQLite est rapide et fiable, n'importe quelle application peut le modifier et une méthode de transaction empêche la collision. Ajoutez simplement un enregistrement à une table pour chaque événement ou utilisez une seule table avec une colonne [event]. L'insertion est très rapide, ce qui est lent, c'est la recherche, mais vous ne ferez des recherches que lors de l'analyse des données, si tout va bien APRÈS la performance est un facteur.

+0

Merci. Oui, les données seront complètement lues indépendamment. Probablement pas même sur la même machine, donc un format portable se prête (je comprends même le format binaire de SQLite est largement portable à travers les versions et certainement à travers les architectures). – 0xC0000022L

1

De nos jours, pour

de mettre à jour des données de type clé/valeur

Les développeurs utilisent souvent NoSQL bases de données. Ils fonctionnent principalement sur des systèmes linux, et certains d'entre eux sont en C++ (MongoDB & ClusterPoint). Ils sont vraiment rapides pour ce genre de choses, ils essayent vraiment de garder une faible latence et il devrait être facile d'y accéder à partir de C++ car ils sont codés en C++.

+0

Merci pour la réponse, mais le fait que chacune des instances engendrées doit établir une connexion ne sera-t-il pas un gros problème? Qu'en est-il de l'ACID? – 0xC0000022L

+0

@STATUS_ACCESS_DENIED En savoir plus sur MongoDB que sur ClusterPoint, mais vous pouvez faire des incréments atomiques dans une commande par rapport à une valeur, vous pouvez également utiliser le pool de connexion pour limiter l'établissement d'une connexion froide pour chaque requête. Je ne suis pas certain, mais je pense que Redis pourrait être meilleur pour ce cas d'utilisation particulier ... que ou avoir un service simple qui utilise le stockage persistant dans un fichier qui contient uniquement un entier non signé codé en 64 bits binaire. – Tracker1

Questions connexes