sintaxis que programa lenguaje herramienta estadistico estadistica ejemplos desventajas con analisis r file-format hdf5 netcdf

que - ¿Cuáles son las desventajas de usar archivos.Rdata en comparación con HDF5 o netCDF?



programa r estadistica (4)

Aquí hay una variedad de respuestas:

  1. Abundancia de opciones Primero, la preocupación es válida, pero su lista de opciones es un poco más limitada de lo que debería ser. HDF5 / netCDF4 es una excelente opción y funciona bien con Python, Matlab y muchos otros sistemas. HDF5 es superior al almacenamiento de pepinillos de Python en muchos aspectos: echa un vistazo a PyTables y es muy probable que veas buenas aceleraciones. Matlab solía tener (y aún puede tener) algunos problemas con la forma en que las matrices de células grandes (o quizás struct) se almacenan en HDF5. No es que no pueda hacerlo, sino que fue terriblemente lento. Ese es el problema de Matlab, no los HDF5. Si bien estas son excelentes opciones, también puede considerar si HDF5 es adecuado: considere si tiene algunos archivos muy grandes y podría beneficiarse de una codificación patentada, ya sea por la velocidad de acceso o la compresión. No es demasiado difícil hacer almacenamiento binario en bruto en cualquier idioma y puede diseñar fácilmente algo como el almacenamiento de archivos de bigmemory (es decir, la velocidad de acceso). De hecho, incluso podría usar archivos de bigmemory en otros idiomas, es realmente un formato muy simple. HDF5 es sin duda un buen punto de partida, pero no existe una solución universal para el almacenamiento y acceso de datos, especialmente cuando se trata de conjuntos de datos muy grandes. (Para conjuntos de datos más pequeños, también puede echar un vistazo a los búferes de protocolo u otros formatos de serialización; Dirk hizo RProtoBuf para acceder a estos en R.) Para la compresión, consulte la siguiente sugerencia.

  2. Tamaño Como mencionó Dirk, los formatos de archivo se pueden describir como independientes de la aplicación y dependientes de la aplicación. Otro eje es el almacenamiento independiente del dominio (o ignorante del dominio) o dependiente del dominio (dominio-inteligente ;-)). Si tiene algún conocimiento de cómo surgirán sus datos, especialmente cualquier información que pueda usarse en la compresión, puede crear un formato mejor que cualquier cosa que puedan hacer los compresores estándar. Esto requiere un poco de trabajo. Los compresores alternativos que gzip y bzip también le permiten analizar grandes volúmenes de datos y desarrollar "diccionarios" de compresión apropiados para que pueda obtener una compresión mucho mejor que con los archivos .Rdat. Para muchos tipos de conjuntos de datos, almacenar el delta entre diferentes filas en una tabla es una mejor opción: puede llevar a una compresibilidad mucho mayor (por ejemplo, pueden aparecer muchos 0), pero solo usted sabe si eso funcionará para sus datos.

  3. Velocidad y acceso .Rdat no admite acceso aleatorio. No tiene soporte incorporado para E / S paralelas (aunque puede serializar a un almacenamiento de E / S paralelo, si lo desea). Hay muchas cosas que uno podría hacer aquí para mejorar las cosas, pero son mil cortes para pegar cosas en .Ratat una y otra vez, en lugar de simplemente cambiar a un mecanismo de almacenamiento diferente y eliminar los problemas de velocidad y acceso. (Esto no es solo una ventaja de HDF5: con frecuencia he usado funciones multinúcleo para paralelizar otros métodos de E / S, como bigmemory ).

  4. Las capacidades de actualización R no tienen una forma muy buena de agregar objetos a un archivo .Rdat. Según mi conocimiento, no ofrece ningún "Visor" que permita a los usuarios inspeccionar visualmente o buscar a través de una colección de archivos .Rdat. Según mi conocimiento, no ofrece ningún registro de versiones incorporado de los objetos en el archivo. (Hago esto a través de un objeto separado en el archivo, que registra las versiones de los scripts que generaron los objetos, pero lo subcontrataré a SQLite en una futura iteración). HDF5 tiene todo esto. (Además, el acceso aleatorio afecta a la actualización de los datos: archivos .Rdat, debe guardar todo el objeto).

  5. Soporte comunitario Aunque he defendido su propio formato, es para tamaños de datos extremos. Tener bibliotecas construidas para muchos idiomas es muy útil para reducir la fricción del intercambio de datos. Para los conjuntos de datos más simples (y simple aún significa "bastante complejo" en la mayoría de los casos) o conjuntos de datos moderados a bastante grandes, HDF5 es un buen formato. Hay maneras de vencerlo en sistemas especializados, ciertamente. Aún así, es un buen estándar y significará que se gastará menos esfuerzo organizacional para soportar un formato propietario o específico de la aplicación. He visto que las organizaciones se apegaron a un formato durante muchos años después del uso de la aplicación que generó los datos, simplemente porque se escribió mucho código para cargar y guardar en el formato de esa aplicación y los GB o TB de datos ya estaban almacenados en su formato ( este podría ser usted y R algún día, pero esto surgió de un conjunto estadístico diferente, uno que comienza con la letra "S" y termina con la letra "S" ;-)). Esa es una fricción muy seria para el trabajo futuro. Si utiliza un formato estándar generalizado, puede transferirlo entre él y otros estándares generalizados con mucha mayor facilidad: es muy probable que alguien más haya decidido abordar el mismo problema también. Pruébelo: si hace el convertidor ahora, pero en realidad no lo convierte para usarlo, al menos ha creado una herramienta que otros podrían recoger y usar si llega un momento en que es necesario pasar a otro formato de datos. .

  6. Memoria Con los archivos .Rdat, debe load o attach para acceder a los objetos. La mayoría de las veces, la gente load el archivo. Bueno, si el archivo es muy grande, va mucha memoria RAM. Por lo tanto, cualquiera de los dos es un poco más inteligente al usar attach o separa los objetos en varios archivos. Esta es una gran molestia para acceder a pequeñas partes de un objeto. Para ello, utilizo mapeo de memoria. HDF5 permite el acceso aleatorio a partes de un archivo, por lo que no necesita cargar todos sus datos solo para acceder a una parte pequeña. Es solo una parte de la forma en que funcionan las cosas. Entonces, incluso dentro de R, hay mejores opciones que solo archivos .Rdat.

  7. Scripts para la conversión En cuanto a su pregunta sobre la escritura de un script, sí, puede escribir un script que cargue objetos y los guarde en HDF5. Sin embargo, no es necesariamente prudente hacer esto en un gran conjunto de archivos heterogéneos, a menos que tenga una buena comprensión de lo que se va a crear. No podía comenzar a diseñar esto para mis propios conjuntos de datos: hay demasiados objetos únicos allí, y crear una enorme biblioteca de archivos HDF5 sería ridículo. Es mejor pensar que es como iniciar una base de datos: ¿qué querrá almacenar, cómo la almacenará y cómo se representará y accederá?

Una vez que haya implementado su plan de conversión de datos, puede usar herramientas como Hadoop o incluso la funcionalidad básica de multinúcleo para liberar su programa de conversión y hacerlo de la manera más rápida posible.

En resumen, incluso si se queda en R , le recomendamos que busque otros formatos de almacenamiento posibles, especialmente para grandes conjuntos de datos en crecimiento. Si tiene que compartir datos con otros, o al menos proporcionar acceso de lectura o escritura, entonces se recomiendan otros formatos. No hay razón para gastar su tiempo manteniendo lectores / escritores para otros idiomas, solo son datos, no códigos. :) Concentre su código en cómo manipular los datos de manera sensata, en lugar de dedicar tiempo al almacenamiento, ya que otras personas ya han hecho un gran trabajo en eso.

Se me ha pedido que cambie un software que actualmente exporta archivos .Rdata para que se exporte en un ''formato binario independiente de la plataforma'', como HDF5 o netCDF. Se dieron dos razones:

  1. Los archivos Rdata solo pueden ser leídos por R
  2. La información binaria se almacena de manera diferente según los sistemas operativos o la arquitectura.

También encontré que el "manual de exportación de importación de datos R" no trata los archivos Rdata, aunque sí trata sobre HDF5 y netCDF.

Una discusión sobre R-help sugiere que los archivos .Rdata son independientes de la plataforma.

Preguntas:

  1. ¿En qué medida son válidas estas preocupaciones?
    • Por ejemplo, ¿puede Matlab leer .Rdata sin invocar R?
  2. ¿Son otros formatos más útiles a este respecto que los archivos .Rdata?
  3. ¿Sería posible escribir un script que cree análogos .hdf5 de todos los archivos .Rdata, minimizando los cambios en el programa?

Creo que puedo responder algunas, pero no todas estas preguntas.

  1. Bueno, cualquiera que se lo .Rdata puede leer un archivo .Rdata directamente, pero es un trabajo duro y no tiene mucho beneficio. Así que dudo que Matlab haya hecho eso. Como recordará, R puede leer varios otros formatos de sistema precisamente porque alguien se esfuerza por hacerlo.

  2. Para los formatos de texto, csv parece bastante "estándar", pero para los formatos binarios no lo sé, y csv no es un buen estándar, varía enormemente cómo (especialmente) se manejan las fechas y las citas (y, por supuesto, solo funciona para tablas de datos).

  3. ¡Por supuesto!

Ejemplo:

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)) }


El punto 2 es incorrecto: los archivos binarios .RData son portátiles en las plataformas de hardware y sistema operativo. Para citar desde la página de ayuda para? Guardar:

Todas las plataformas R utilizan la representación XDR (bigendian) de C ints y dobles en archivos binarios save-d, y estos son portátiles en todas las plataformas R.

El punto 1 es una función de lo que son los datos y qué otros programas podrían aplicarse a los datos. Si su base de código usa save () para escribir objetos específicos que son marcos de datos o matrices, puede escribir fácilmente una pequeña función save2hdf () para escribirlos como archivos binarios hdf o ncdf, luego use sed para cambiar todas las apariciones de save (para save2hdf (en su base de código. Al menos ncdf tendrá un impacto de rendimiento en las lecturas, pero no demasiado malo. Si su código utiliza objetos de guardado como listas de objetos heterogéneos, es probable que no pueda usar ncdf o hdf sin una gran Trato de recodificación para escribir objetos componentes separados.

También tenga en cuenta que netCDF 4 sigue siendo problemático en R.


Los formatos de archivo (binarios) vienen en dos sabores básicos:

  • aplicación neutral , soportada por bibliotecas públicas y API (y tanto netCDF como HDF5 caen en este campo) que facilita el intercambio de datos entre diferentes programas y aplicaciones, siempre que se extiendan con paquetes adicionales que utilizan las API

  • aplicaciones específicas de la aplicación solo diseñadas para trabajar con un programa, aunque de manera más eficiente: eso es lo que hace .RData

Debido a que R es de código abierto, puede volver a crear el formato para RData desde sus archivos Matlab: Nada le impide escribir un archivo mex adecuado. Tal vez alguien ya lo haya hecho ya. No hay ninguna razón técnica para no intentarlo, pero la otra ruta puede ser más fácil si ambas aplicaciones que comparten los datos admiten el formato igualmente bien.

Para lo que vale la pena, a principios / mediados de la década de 1990, escribí mi propio código C para escribir archivos de simulación en el formato binario usado por Octave (que utilicé y luego corté los datos). Ser capaz de hacer esto con software de código abierto es una gran ventaja.