Qu’est-ce qu’un bon candidat au stockage pour l’acquisition de données en temps réel sous Linux?

Je construis un système pour l’acquisition de données. Les données acquises sont généralement composées de 15 signaux, chacun échantillonné à (disons) 500 Hz. C’est-à-dire que chaque seconde environ 15 x 500 x 4 octets (float signé) arriveront et devront persister.

La version précédente était basée sur .NET (C #) et utilisait une firebase database DB4O pour le stockage des données. C’était assez efficace et performant.

La nouvelle version sera basée sur Linux, utilisant Python (ou peut-être Erlang) et … Oui! Qu’est-ce qu’un candidat de stockage approprié?

Je pense à MongoDB, en stockant chaque échantillon (ou un groupe d’entre eux) en tant qu’objects BSON. Chaque échantillon (bloc) aura un compteur d’échantillons en tant que champ clé (indexé), ainsi qu’une identification de source de signal.

Le problème est que je dois pouvoir récupérer des échantillons assez rapidement. Sur demande, il faut récupérer jusqu’à 30 secondes de données en moins d’une seconde, en utilisant une plage de compteurs d’échantillons et les sources de signaux demandées. La version actuelle (C # / DB4O) gère ce problème, récupérant les données en moins de 100 ms.

Je sais que Python n’est peut-être pas idéal en termes de performances, mais nous le verrons plus tard.

Le système (“serveur”) aura plusieurs clients d’acquisition connectés, de sorte que l’architecture doit bien évoluer.

Edit: Après d’autres recherches, j’irai probablement avec HDF5 pour obtenir des exemples de données et soit Couch ou Mongo pour plus d’informations de type document. Je te tiendrai au courant.

Edit: La solution finale était basée sur HDF5 et CouchDB. Il s’est bien passé, mis en œuvre en Python, fonctionnant sur un Raspberry Pi.

vous pourriez regarder en utilisant HDF5 … Il est conçu pour les données en streaming, permet la recherche indexée dans le temps et (pour autant que je sache) est assez bien pris en charge en Python

En utilisant les touches que vous avez décrites, vous devriez pouvoir mettre à l’échelle via le sharding si nécessaire. 120kB / 30sec ist pas tellement, donc je pense que vous n’avez pas besoin de partager trop tôt.

Si vous comparez cela à la simple utilisation de fichiers, vous obtiendrez des requêtes plus sophistiquées et une réplication intégrée pour la haute disponibilité, le traitement DS ou hors ligne (Map Reduce, etc.).

Dans votre cas, vous pouvez simplement créer 15 fichiers et enregistrer chaque échantillon séquentiellement dans le fichier correspondant. Cela permettra de s’assurer que les échantillons demandés sont stockés en continu sur le disque et donc de réduire le nombre de recherches de disque lors de la lecture.