Question

J'ai une variété de données de séries chronologiques stockées sur une grille plus ou moins géoréférencée, par ex. une valeur pour 0,2 degré de latitude et de longitude. Actuellement, les données sont stockées dans des fichiers texte. Ainsi, au 251e jour de l’année, vous pourriez voir:

251
 12.76 12.55 12.55 12.34 [etc., 200 more values...]
 13.02 12.95 12.70 12.40 [etc., 200 more values...]
 [etc., 250 more lines]
252
 [etc., etc.]

Je voudrais augmenter le niveau d'abstraction, améliorer les performances et réduire la fragilité (par exemple, le code actuel ne peut pas insérer une journée entre deux journées existantes!). Nous avions manipulé les hacks BLOB-y SGBDR et même reproduit chaque ligne du format de fichier texte sous la forme d’une ligne dans un tableau (une ligne par paire horodatage / latitude, une colonne par incrément de longitude - yecch!).

Nous pourrions passer à un "réel". géodatabase, mais la surcharge de marquer chaque valeur individuelle avec un lat et long semble prohibitive. La taille et la résolution des données n'ont pas changé depuis dix ans et il est peu probable que cela se produise.

Je m'occupe de tout mettre dans les fichiers NetCDF, mais je pense que nous devons dépasser complètement l'état d'esprit des fichiers - je déteste le fait que tous mes logiciels doivent comprendre les noms de fichiers à partir de dates, gérer plusieurs fichiers pendant plusieurs années. , etc. L'alternative, qui consiste à mettre les données des dix années (et à les compter) dans un seul fichier, ne semble pas non plus fonctionner.

Des idées brillantes ou des produits?

Était-ce utile?

La solution

J'ai rassemblé vos commentaires ici:

  1. J'aimerais faire tout cela "sans écrire mon propre code d'E / S de fichier"
  2. J'ai besoin d'un accès à partir de "Java Ruby MATLAB". et "routines FORTRAN"

Lorsque vous les ajoutez, vous ne voulez certainement pas un nouveau format de fichier. Respectez celui que vous avez.

Si nous pouvons vous aider à assouplir votre première exigence, c’est-à-dire si vous souhaitez écrire votre propre code d’E / S sur fichier, vous disposez de plusieurs options intéressantes. J'écrirais des classes C ++ et utiliserais quelque chose comme SWIG pour rendre vos nouvelles classes disponibles dans les multiples langues dont vous avez besoin. (Mais je ne suis pas sûr que vous puissiez utiliser SWIG pour vous donner accès à partir de Java, Ruby, MATLAB et FORTRAN. Vous pourriez avoir besoin de quelque chose d'autre. Je ne sais pas vraiment comment le faire moi-même.)

Vous avez également dit: "En fait, si je dois avoir des fichiers, je préfère le texte, car je peux simplement entrer et éditer à la main si nécessaire."

Je pense qu’il s’agit d’une déclaration erronée. Si vous êtes prêt à créer vos propres routines d'E / S sur fichier, vous pouvez faire des choses très intelligentes ... Et comme solution de rechange ultime, vous pourriez vous donner un outil qui convertit le nouveau format de fichier en le même ancien format de texte que vous avez l'habitude de ... Et un autre outil qui convertit en arrière. J'y reviendrai à la fin de mon message ...

Vous avez dit quelque chose que je veux aborder:

"tirer parti de 40 ans d'optimisation de la base de données"

Les bases de données sont destinées aux données relationnelles et non aux données raster. Vous n'utiliserez les optimisations de base de données de personne avec ce type de données. Vous pourriez peut-être intégrer vos données dans une base de données, mais ce n’est pas la même chose.

Voici la chose la plus utile que je puisse vous dire, sur la base de tout ce que vous nous avez dit. Vous avez dit ceci:

"Je suis plus intéressé par l'optimisation de mon temps que par celui du CPU, bien que la vitesse d'exécution soit bonne!"

Cela va franchement nécessiter des outils. Arrêtez de le considérer comme un fichier texte. Commencez à penser aux tâches courantes que vous faites et écrivez de petits outils - en QUELLE LANGUE (S) - pour rendre ces choses TRIVIALES à faire.

Et si vos outils s'avéraient avoir de mauvaises performances? Devinez quoi - c'est parce que votre fichier texte plat est un format cruddy. Mais c'est juste mon opinion. :)

Autres conseils

Je passerais certainement du texte au binaire mais garderais chaque jour dans un fichier séparé. Vous pouvez les nommer de manière à ce que les insertions entre les deux ne causent aucune étrangeté avec les index, par exemple en incluant la date et l'heure possible dans le nom du fichier. Vous pouvez également considérer la structure de fichier si vous avez plusieurs champs par emplacement, par exemple. Est-il courant de rechercher une petite tuile parmi un grand nombre de pas de temps? Dans ce cas, vous voudrez peut-être les stocker sous forme de mosaïques contenant des données de plusieurs jours. Vous n'avez pas mentionné le mode d'accès aux données, qui joue un rôle important dans la manière de les organiser efficacement.

Clarifications:

Je suis surpris que vous ayez ajouté " base de données " comme l'une des balises, et l'a considéré comme une option. Pourquoi avez-vous fait cela?

Pour l'essentiel, vous avez une image en virgule flottante 2D à composant unique à chaque pas de temps. Seriez-vous d'accord avec cette manière de visualiser vos données?

Vous avez également mentionné le désir d’insérer une journée entre deux journées existantes - ce qui semble être une chose très étrange à faire. Pourquoi auriez-vous besoin de faire ça? Y at-il un nouveau jour entre le 4 et le 5 mai que je ne sache pas?

Est " compression " l’une des choses qui vous tiennent à cœur, ou en avez-vous juste marre des fichiers plats?

Un flottant ou un double suffirait-il pour stocker vos données ou pensez-vous avoir besoin d'une plus grande précision arbitraire?

De plus, avec quel (s) langage (s) de programmation souhaitez-vous accéder à ces données?

Votre réponse sur la manière de stocker les données dépend entièrement de ce que vous allez faire avec les données. Par exemple, si vous avez uniquement besoin de récupérer en spécifiant la date ou une plage de dates, le stockage dans une base de données en tant que BLOB a du sens. mais si vous devez trouver des enregistrements qui ont certaines valeurs, vous devrez faire quelque chose de différent.

décrivez comment vous devez pouvoir accéder aux données /

Matt, merci beaucoup, ainsi que Longneck et Jirv.

Ce message était en partie une expérience, testant la qualité du discours sur le stackoverflow. Si vos formes de vie de gars / filles / extraterrestres sont représentatives, je suis vendu.

Et sur ce point, vous avez considérablement clarifié ma pensée. Remarquez que je ne pourrais toujours pas nécessairement mettre en œuvre votre conseil, mais sachez que je vais y réfléchir très sérieusement. > ;; -)

Je peux très bien conserver le même format de fichier, ajouter aux routines C et / ou Ruby existantes des éléments de bas niveau qui me manquent (par exemple, l'insertion de timesteps manquants) et accrocher un frontal HTTP à la pour que les données puissent être consommées par n’importe quelle boîte qui en a besoin, quelle que soit la langue utilisée actuellement. Bien que la plupart du temps, ce sont des logiciels hérités immuables qui construisent ces données, nous arrivons toujours avec de nouveaux consommateurs. Par conséquent, l'exigence multilingue / multi-ordinateur (ai-je oublié celui-là?) S'applique au côté lecture, le côté écriture. Cela évite également toute une série de problèmes de sécurité.

Merci encore, chers amis.

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