Quels sont les inconvénients de l'utilisation.Les fichiers Rdata comparés à HDF5 ou netCDF?

on m'a demandé de changer un logiciel qui exporte actuellement .Rdata exporte dans un "format binaire indépendant de la plate-forme" tel que HDF5 ou netCDF. Deux raisons ont été données:

  1. les fichiers Rdata ne peuvent être lus que par R
  2. les informations binaires sont stockées différemment selon les systèmes d'exploitation ou l'architecture

j'ai aussi trouvé que le "R Data import export manuel" ne traite pas des fichiers Rdata, mais plutôt de HDF5 et netCDF.

Un discussion sur la R-help suggère que l' .Les fichiers Rdata sont indépendants de la plate-forme.

Questions:

  1. dans quelle mesure ces préoccupations sont-elles valables?
    • p.ex. can Matlab read .Rdata sans invoquer R?
  2. sont d'autres formats plus utiles à cet égard, que .Des fichiers Rdata?
  3. serait-il possible d'écrire un script qui créerait .les analogues hdf5 de tous .Les fichiers Rdata, minimisant les changements au programme lui-même?
26
demandé sur Iterator 2011-10-20 19:08:05

4 réponses

Voici une variété de réponses:

  1. abondance d'options tout d'abord, la préoccupation est valide, mais votre liste de choix est un peu plus étroite qu'elle ne devrait l'être. HDF5 / netCDF4 est une excellente option, et fonctionne bien avec Python, Matlab, et beaucoup d'autres systèmes. HDF5 est supérieur au stockage pickle de Python de nombreuses façons - Vérifiez PyTables et vous verrez très probablement de bonnes vitesses. Matlab avait (et peut avoir ont encore) quelques problèmes avec la façon dont de grandes cellules (ou peut-être struct) réseaux sont stockées dans HDF5. Non pas qu'il ne peut pas le faire, mais qu'il était dieu terrible lent. C'est le problème de Matlab, pas de HDF5. Bien qu'il s'agisse de bons choix, vous pouvez également vous demander si HDF5 est adéquat: pensez à savoir si vous avez de très gros fichiers et pourriez bénéficier d'un encodage propriétaire, que ce soit pour la vitesse d'accès ou la compression. Il n'est pas trop difficile de faire le stockage binaire brut dans n'importe quelle langue et vous pourriez facilement concevoir quelque chose comme le stockage de fichiers de bigmemory (c.-à-d. la vitesse d'accès). En fait, vous pouvez même utiliser des fichiers bigmemory dans d'autres langues - c'est vraiment un format très simple. HDF5 est certainement un bon point de départ, mais il n'existe pas de solution universelle pour le stockage de données et l'accès", 1519150920" surtout quand on arrive à de très grands ensembles de données. (Pour les plus petits ensembles de données, vous pouvez également jeter un oeil aux tampons de protocole ou d'autres formats de sérialisation; Dirk a fait RProtoBuf pour accéder à ceux - ci en R.) Pour la compression, voir la suggestion suivante.

  2. Size comme Dirk l'a mentionné, les formats de fichier peuvent être décrits comme neutres et dépendants de l'application. Un autre axe est le stockage indépendant du domaine (ou ignorant du domaine) ou dépendant du domaine (intelligent du domaine; -)). Si vous avez une certaine connaissance de la façon dont vos données vont apparaître, en particulier toute information qui peut être utilisée en compression, vous pouvez être en mesure de construisez un meilleur format que tout ce que les compresseurs standards peuvent être capables de faire. Cela prend un peu de travail. Les compresseurs alternatifs que gzip et bzip vous permettent également d'analyser de grands volumes de données et de développer des "dictionnaires" de compression appropriés afin que vous puissiez obtenir une meilleure compression que vous le feriez avec .Fichiers Rdat. Pour de nombreux types d'ensembles de données, stocker le delta entre différentes lignes dans une table est une meilleure option - il peut conduire à beaucoup plus compressibilité (par exemple, beaucoup de 0s peut vous seul savez si cela fonctionne pour vos données.

  3. la Vitesse et l'accès .Rdat ne supporte pas l'accès aléatoire. Il n'a pas de support intégré pour les entrées/sorties parallèles (bien que vous puissiez sérialiser vers un stockage d'entrées/sorties parallèles, si vous le souhaitez). Il y a beaucoup de choses qu'on pourrait faire ici pour améliorer les choses, mais c'est mille coupes pour coller des trucs dessus .Rdat encore et encore, plutôt que de passer à un autre mécanisme de stockage et souffler les problèmes de vitesse et d'accès. (Ce n'est pas seulement un avantage de HDF5: j'ai souvent utilisé des fonctions multicore pour paralléliser d'autres méthodes D'e/s, comme bigmemory .)

  4. capacités de mise à Jour R n'a pas une très belle façon d'ajouter des objets à un .Dossier Rdat. Il n'offre pas, à ma connaissance, des "téléspectateurs" pour permettre aux utilisateurs d'inspecter visuellement ou de recherche à travers une collection de .Rdat fichier. À ma connaissance, il n'offre pas de tenue de dossiers intégrée de version des objets contenus dans le dossier. (Je le fais via un objet séparé dans le fichier, qui enregistre les versions des scripts qui ont généré les objets, mais je vais externaliser cela à SQLite dans une itération future.) HDF5 a tout cela. (Aussi, l'accès aléatoire affecte la mise à jour des données .Les fichiers Rdat, vous devez sauver l'objet entier.)

  5. soutien communautaire bien que j'ai préconisé votre propre format, c'est-à-dire pour les tailles extrêmes de données. Le fait d'avoir des bibliothèques construites pour de nombreuses langues est très utile pour réduire les frictions liées à l'échange de données. Pour la plupart des ensembles de données simples (et simple still signifie "assez complexe" dans la plupart des cas) ou des ensembles de données modérés à assez grands, HDF5 est un bon format. Il y a des moyens de le battre sur des systèmes spécialisés, certainement. Encore, il est un bon standard et se traduira par moins d'efforts d'organisation seront consacrés au maintien d'un format propriétaire ou spécifique à l'application. J'ai vu des organisations coller à un format pendant de nombreuses années après l'utilisation de l'application qui a généré les données, juste parce que tant de code a été écrit pour charger et enregistrer dans le format de cette application et GBs ou TBs de données ont déjà été stockées dans son format (cela pourrait être you & R un jour, mais cela est né d'une suite statistique différente, une qui commence par la lettre "S" et se termine par la lettre "S" ;-)). C'est une friction très sérieuse pour l'avenir. travail. Si vous utilisez un format standard répandu, vous pouvez alors transférer entre lui et d'autres normes répandues avec beaucoup plus de facilité: il est très probable que quelqu'un d'autre a décidé de s'attaquer au même problème, aussi. Donnez-lui un essai-si vous faites le convertisseur maintenant, mais ne le convertissez pas réellement pour l'utiliser, au moins vous avez créé un outil que d'autres pourraient ramasser et utiliser s'il vient un moment où il est nécessaire de passer à un autre format de données.

  6. Mémoire .Les fichiers Rdat, vous devez load ou attach it afin d'accéder aux objets. La plupart du temps, les gens load le fichier. Si le fichier est très gros, il y a beaucoup de mémoire vive. Ainsi, l'un ou l'autre est un peu plus intelligent sur l'utilisation de attach ou sépare des objets en plusieurs fichiers. C'est assez gênant pour accéder à de petites parties d'un objet. À cette fin, j'utilise de la mémoire. HDF5 permet l'accès aléatoire à des parties d'un fichier, si vous avez besoin ne pas charger toutes vos données juste pour accéder à une petite partie. C'est juste une partie de la façon dont les choses fonctionnent. Donc, même à L'intérieur de R, Il y a de meilleures options que juste .Fichiers Rdat.

  7. Scripts de conversion quant à votre question sur l'écriture d'un script, oui, vous pouvez écrire un script qui charge les objets et les enregistre dans HDF5. Cependant, il n'est pas nécessairement sage de le faire sur un ensemble énorme de fichiers hétérogènes, à moins que vous ayez une bonne la compréhension de ce qui va être créé. Je ne pourrais pas commencer à concevoir ceci pour mes propres ensembles de données: il y a trop d'objets uniques là-dedans, et créer une énorme bibliothèque de fichiers HDF5 serait ridicule. Il est préférable de penser à cela comme le début d'une base de données: ce que vous voulez stocker, comment conservez-vous, et comment peut-elle être représentée et accessible?

une fois que vous avez votre plan de conversion des données en place, vous pouvez alors utiliser des outils comme Hadoop ou même la fonctionnalité de base multicore pour libérer votre programme de conversion et obtenir Cela fait aussi vite que possible.

en bref, même si vous restez dans R , vous êtes bien avisé de regarder d'autres formats de stockage possibles, en particulier pour les grands ensembles de données en croissance. Si vous devez partager des données avec d'autres, ou au moins de donner accès en lecture / écriture, puis d'autres formats sont très bien conseillé. Il n'y a aucune raison de passer votre temps à entretenir des lecteurs / écrivains pour les autres langues - c'est juste données pas de code. :) Concentrez votre code sur la façon de manipuler les données de manière raisonnable, plutôt que de passer du temps à travailler sur le stockage - d'autres personnes ont déjà fait un très bon travail sur ce sujet.

28
répondu Iterator 2011-10-25 19:01:30

(binaire) formats de fichier viennent en deux saveurs de base:

  • application-neutre , pris en charge par les bibliothèques publiques et les API (et netCDF et HDF5 tombent dans ce camp) qui facilite l'échange de données entre les différents programmes et applications à condition qu'ils soient étendus avec des paquets supplémentaires en utilisant les API

  • application-specific ceux conçus pour fonctionner avec un seul programme, bien que plus efficacement: voilà ce qu'il en est .RData

parce que R est open-source, vous pouvez recréer le format pour RData à partir de vos fichiers Matlab: rien ne vous empêche d'écrire un bon fichier mex qui. Peut-être quelqu'un l'a même déjà fait. Il n'y a aucune raison de ne pas essayer---mais l'autre voie peut être plus facile si les deux les applications destinées à partager les données supportent également bien le format.

pour ce que cela vaut, au début/milieu des années 1990, j'ai écrit mon propre code C pour écrire des fichiers de simulation dans le format binaire utilisé par Octave (que j'ai utilisé puis trancher les données). Être capable de faire cela avec un logiciel libre est un grand plus.

9
répondu Dirk Eddelbuettel 2011-10-20 17:46:49

je pense que je peux répondre à certaines, mais pas toutes ces questions.

  1. Eh bien, toute personne qui s'y intéresse peut probablement lire un fichier .Rdata directement, mais c'est du travail et pas beaucoup d'avantages. Je doute donc que Matlab ait fait cela. Comme vous pouvez vous rappeler, R peut lire divers autres formats de système, précisément parce que quelqu'un a mis beaucoup d'efforts à faire.

  2. pour les formats de texte csv seem assez "standard", mais pour les formats binaires Je ne sais pas - et csv n'est pas un bon standard à cela - il varie sauvagement comment (surtout) les dates et les citations sont traitées (et bien sûr il ne fonctionne que pour les tables de données).

  3. bien sûr!

exemple:

for(f in list.files(".", pattern="\.Rdata$") {
    e <- new.env()
    load(f, e)       # load all values into environment e
    x <- as.list(e)

    #saveInOtherFormat(x, file=sub("\.Rdata$", ".Other", f))
}
5
répondu Tommy 2011-10-20 16:02:55

Point 2 est erroné: binaire .Les fichiers RData sont portables à travers le matériel et les plates-formes D'OS. Pour citer de la page d'aide pour ?save:

toutes les plates-formes R utilisent la représentation XDR (bigendian) des cits et des doubles dans les fichiers binaires save-d, et ceux-ci sont portables à travers toutes les plates-formes R.

Point 1 est une fonction de ce que sont les données, et quels autres programmes pourraient être utilement appliqués à la données. Si votre base de code utilise save() pour écrire des objets spécifiés qui sont des dataframes ou des matrices, vous pouvez facilement écrire une petite fonction save2hdf () pour les écrire sous forme de fichiers binaires HDF ou ncdf, puis utiliser sed pour modifier toutes les occurrences de save( à save2hdf (dans votre base de codes. Au moins ncdf aura un coup sur la performance du lit, mais pas trop d'un coup. Si votre code utilise sauve des objets comme des listes d'objets hétérogènes, vous ne pouvez probablement pas utiliser ncdf ou hdf sans beaucoup de recodage à écrire des objets composants séparés.

aussi noter que netCDF 4 est toujours problématique dans R.

4
répondu tomp 2011-10-24 22:19:03