6
votes

Quel est un format optimal pour économiser de grandes quantités de données numériques (GBS) à partir d'un programme C?

Je suis un physicien qui traite normalement de grandes quantités de données numériques générées à l'aide de programmes C. En règle générale, je stocke tout comme des colonnes dans les fichiers ASCII, mais cela avait conduit à des fichiers massivement volumineux. Étant donné que je suis limité dans l'espace, c'est un problème et j'aimerais être un peu plus intelligent sur le tout. Alors ...

  1. Y a-t-il un meilleur format que ASCII? Dois-je utiliser des fichiers binaires ou peut-être un format personnalisé de la bibliothèque?

  2. Dois-je compresser chaque fichier individuellement ou dans l'ensemble du répertoire? Dans les deux cas, quel format dois-je utiliser?

    Merci beaucoup!


1 commentaires

Essayez d'utiliser un format différent. Si vous utilisez des fichiers .csv, vous pouvez économiser beaucoup d'espace (et vous pouvez l'ouvrir dans Excel ou Calc). en.wikipedia.org/wiki/comma-separated_values ​​ je dirais aussi que la compression peut ' t blessé.


4 Réponses :


3
votes
  1. Si vous avez besoin des fichiers plus longtemps, ce sont des données expérimentales importantes qui prouvent quelque chose pour vous ou donc, n'utilisez pas de formats binaires. Vous ne pourrez pas les lire lorsque votre architecture change. dangereux. coller au texte (oui ascii) fichiers.

  2. Choisissez un format de compression qui correspond à vos besoins. Le temps de compression est-il un problème? Généralement pas, mais vérifiez que vous-même. La décompression est-elle un problème? Habituellement oui, si vous souhaitez effectuer une analyse de données dessus. Dans ces conditions, j'irais pour BZIP2. Ceci est assez courant de nos jours, bien testé, infaillible. Je ferais des fichiers individuellement, car plus votre fichier est grand, plus la probabilité de pertes. (BITS Flip, etc.).


7 commentaires

Les formats de données scientifiques standard tels que CDF, HDF (comme également recommandé par une autre réponse), et résolvent totalement le problème «non capable de lire», et la résolvez-la mieux que ASCII (qui n'inclut pas nécessairement suffisamment de métadonnées et peut être sensiblement plus lent pour écrire et re-lire).


-1, le format de texte est horrible pour stocker des données numériques, il est quasi impossible de reproduire des nombres de flotteurs en tant que chaîne.


@AAA: En fait, ce n'est pas si difficile. La question a été lancée, mais la réponse facile est de le jeter comme hexagone.


@Steven Comment ça va beaucoup mieux que le décharge binaire? Vous devez toujours accueillir l'ordre d'octet


@AAA: C'était la réponse facile. Voici le reste: Stackoverflow.com/Questtions/3215235/...


Aussi C99 a % A spécificateur de format pour * printf () Fonctions, qui prend soin de la rédaction + problème de lecture.


Une implémentation conforme de printf et strTOD assurera l'exactitude du déclenchement aller-retour des nombres de points flottants imprimés en décimal, tant que vous imprimez suffisamment de chiffres décimaux. Si vous êtes inquiet et que vous avez C99 à votre disposition, en utilisant % A est un moyen beaucoup plus agréable de le gérer.



2
votes

Un disque téraoctet est cent dollars. Difficile à manquer d'espace ces jours-ci. Bien sûr, stocker les données dans l'espace Binary Saves. Mais il y a un coût, vous aurez beaucoup moins de choix pour obtenir les données du dossier à nouveau.

Vérifiez ce que votre système d'exploitation peut faire. Windows prend en charge la compression automatique sur les dossiers, par exemple, le contenu du fichier est zippé par le système de fichiers sans avoir à faire quoi que ce soit du tout. Les taux de compression doivent bien concurrencer les données binaires brutes.


1 commentaires

Accepté, bien que je suggère que rar.



2
votes

Il y a beaucoup d'informations que vous n'avez pas inclus, mais devriez penser à:

1.) Vous stockez des entiers ou des flotteurs? Quelle est la gamme typique des nombres? Par exemple: stocker de petits entiers séparés par des virgules à ASCII, tels que "1,2,4,2,1", 2 octets par datum, mais les stockeront comme binaires nécessiteraient 4 octets par datum.

Si vos entiers sont typiquement de 3 chiffres, alors les VS séparés par des virgules ne comptent pas beaucoup.

D'autre part, le stockage des doubles (valeurs de 8 octets) sera presque certainement plus petit au format binaire.

2.) Comment avez-vous besoin d'accéder à ces valeurs? Si vous n'êtes pas préoccupé par le temps d'accès, Compressez-vous! D'autre part, si vous avez besoin d'un accès rapide et aléatoire, la compression vous empêchera probablement.

3.) Certaines valeurs sont-elles fréquemment répétées? Ensuite, vous pouvez envisager un codage de Huffman ou une table de valeurs "courtes".


0 commentaires

8
votes

Dans vos chaussures, je tiendrais compte des formats de données scientifiques standard, qui sont beaucoup moins importants et consommateurs de temps que ASCII, mais (tandis qu'elles ne sont peut-être pas tout à fait un peu efficaces que pure, machine Les formats binaires de type) offrent toujours des bibliothèques standard documentées et portables, rapides pour faciliter la lecture et l'écriture des données.

Si vous stockez des données sous forme binaire pure, les métadonnées sont cruciales pour que tout sens soit à nouveau sur les données (ces numéros sont-ils simples ou double précision, ou entiers et de quelle longueur, quelles sont les matrices 'Dimensions, etc., etc), et les problèmes liés à l'archivage et à la récupération des paires de données / métadonnées jumelées peuvent, et dans la pratique, rendent parfois des jeux de données parfaitement bons inutilisables - une véritable pitié et déchets.

CDF , en particulier, est "un format de données auto-décrivant pour le stockage et la manipulation de Données scalaires et multidimensionnelles dans une mode indépendante de la plate-forme et de la discipline »avec de nombreuses bibliothèques et utilitaires pour y aller. En tant qu'alesternatives, vous pouvez également envisager netcdf et HDF - Je suis moins familier avec ceux (et de tels compromis que la flexibilité VS Taille VS Vitesse), mais, voyant à quel point ils sont largement utilisés par des scientifiques Dans de nombreux domaines, je soupçonne que l'un des trois formats pourrait vous donner des résultats très acceptables.


2 commentaires

J'ai travaillé sur un système d'acquisition de données hautes performances il y a environ 3 ans et NetCDF était un cauchemar absolu. C'était "là" quand je suis entré, il aurait donc pu être mal configuré. Tout ce que je sais, c'est que nous l'avons remplacé dès que possible. Ymmv.


@Justboo: Et qu'avez-vous utilisé au lieu de NetCDF?