Existe-t-il des outils spécialement conçus pour compresser les données scientifiques en virgule flottante?
Si une fonction est lisse, il y a évidemment beaucoup de corrélation entre les nombres représentant cette fonction, donc les données doivent bien se compresser. Zipper / gzipper des données binaires en virgule flottante ne les comprime pas si bien cependant. Je me demande s'il existe une méthode spécifiquement développée pour compresser les données à virgule flottante.
Exigences:
Soit une compression sans perte ou la possibilité de spécifier un nombre minimum de chiffres à conserver (pour certaines applications, cela
double
peut être plus que ce dont nous avons besoin alorsfloat
que la précision peut ne pas être suffisante).Outil de travail bien testé (c'est-à-dire pas seulement un article décrivant une méthode théorique).
Convient pour compresser des données numériques 1D (comme une série chronologique)
Multiplateforme (doit fonctionner sous Windows)
Il doit être rapide - de préférence pas beaucoup plus lent que gzip. J'ai constaté que si j'ai les numéros stockés en ASCII, le compresser le fichier peut accélérer la lecture et le traitement (car l'opération peut être liée aux E / S).
J'aimerais particulièrement entendre des gens qui ont effectivement utilisé un tel outil.
la source
Réponses:
Essayez Blosc . Dans de nombreux cas, il est plus rapide que memcopy . Réfléchissez y un peu. . . méchant.
Il est super stable, hautement contrôlé, multiplateforme et fonctionne comme un champion.
la source
J'ai obtenu de bons résultats en utilisant HDF5 et son filtre GZIP.
Le HDF5 fournit également un filtre SZIP qui permet d'obtenir de meilleurs résultats pour certains ensembles de données scientifica.
D'après mon expérience, le choix des compressions dépend fortement du type de données et l'analyse comparative est probablement le seul moyen de faire un bon choix.
BTW, les filtres tiers pour HDF5 incluent BLOSC, BZIP2, LZO, LZF, MAFISC.
la source
Selon la fonction sous-jacente, vous pourrez peut-être ajuster les données à une forme fonctionnelle sans erreur, nécessitant moins de coefficients pour décrire la forme fonctionnelle que vous n'en avez de point de données (conduisant à la compression). Des résultats d'erreur existent pour certaines de ces méthodes, même si je ne sais pas si l'une d'elles vous donnera des limites ou des estimations a priori (ou a posteriori ) de l'erreur.
Vous pouvez également consulter des méthodes développées spécifiquement pour la compression de nombres à virgule flottante, comme le FPC et les algorithmes associés. Voir les articles ici , ici , ici , ici et ici , ainsi qu'une page Web contenant l'ancien code source ici .
la source
HDF5 peut utiliser un algorithme de "réarrangement" où les octets pour N nombres à virgule flottante sont réorganisés de sorte que les premiers octets des N nombres viennent en premier, puis le 2e, et ainsi de suite. Cela produit de meilleurs taux de compression après l'application de gzip, car il est plus susceptible de produire des séquences plus longues de la même valeur. Voir ici pour quelques repères .
la source
SZ (développé par Argonne en 2016) pourrait être un bon choix.
SZ: Compresseur de données à virgule flottante délimité par des erreurs rapides pour les applications scientifiques https://collab.cels.anl.gov/display/ESR/SZ
la source
Méthodes possibles pouvant être utilisées pour la compression à virgule flottante:
Transposer 4xN pour float et 8xN pour double + lz77
Implémentation: Compression à virgule flottante dans TurboTranspose
voir aussi compression avec perte avec limites d'erreur
Predictor (ex. Finite Context Method) + encodage (ex. "Compression entière").
Implémentation: Compression à virgule flottante dans TurboPFor
incluant une compression spéciale pour les séries chronologiques.
lorsque cela est possible, convertissez tous les nombres à virgule flottante en entiers (ex. 1,63 -> 163), puis utilisez la compression entière
Vous pouvez tester toutes ces méthodes avec vos données à l'aide de l' outil icapp pour Linux et Windows.
la source
Nous utilisons ZFP avec HDF5 pour nos données d'imagerie médicale. Il est conçu pour une compression à virgule flottante avec perte.
Nous l'exécutons littéralement sur tout et avons plus de 40 To de données stockées (et utilisées!). Il est assez rapide pour sauvegarder nos données en temps réel, et nous pouvons spécifier la précision requise, donc bien que le format soit avec perte, nous ne voyons aucune différence dans nos sorties finales.
la source
Peut-être que le format dont vous avez besoin doit stocker uniquement les décalages de la valeur à la valeur voisine.
Alternativement, vous pouvez peut-être utiliser le domaine fréquentiel, peut-être même enregistrer ces valeurs sous forme de fichier audio sans perte tel que "flac lossless", car vous avez besoin des mêmes propriétés pour un son.
Cependant, je vais adopter une approche différente pour tenter de répondre à la question qui, je l'espère, pourra être utile. Comme vous le dites également, la longueur minimale de description pour représenter ces données est inférieure à la fourniture de tous les points de données.
https://en.wikipedia.org/wiki/Minimum_description_length
En fait, un programme, le code informatique, est un bon exemple. Et si cela ne vous dérange pas que quelque chose soit principalement des données fonctionnant en exécutant, et donc aussi du code, vous pouvez compresser vos valeurs à virgule flottante en quelque chose comme une fonction ou des formules.
Faire cela particulièrement bien automatiquement et dans une quantité réaliste de calcul est au-delà de la difficulté. Cependant, Wolfram Language fournit certaines fonctionnalités pour tenter cela:
https://reference.wolfram.com/language/ref/FindSequenceFunction.html https://reference.wolfram.com/language/ref/FindGeneratingFunction.html https://reference.wolfram.com/language/ref/FindFormula. html
https://reference.wolfram.com/language/ref/RSolve.html
la source
Pourquoi ne pas simplement enregistrer float32 / float16? En numpy,
Cela ne fonctionnera pas si vous simulez l' effet papillon dans la théorie du chaos, mais ils sont compréhensibles, portables, "ne nécessitent aucun travail de ma part". Et la compression 2: 1/4: 1 sur float64 est difficile à battre :)
Remarques:
"Le type de tableau float16 n'est pas pris en charge dans np.linalg"; vous devrez l'étendre à 32 ou 64 après l'avoir lu.
Pour voir comment les paramètres à virgule flottante diffèrent,
Pour un tracé d'un cas de test trivial comparant les flottants 64 32 et 16, voir ici .
la source