anaconda - ¿hdf5 soporta lecturas concurrentes, o escribe en archivos diferentes?
(2)
AFAICT, hay tres formas de construir libhdf5:
- sin seguridad de subprocesos ni compatibilidad con MPI (como en la receta de
conda
que publicaste) - Con soporte MPI pero sin seguridad de hilos.
- Con hilo de seguridad pero sin soporte MPI.
Es decir, los --enable-threadsafe
y --enable-parallel
se excluyen mutuamente ( https://www.hdfgroup.org/hdf5-quest.html#p5thread
).
En cuanto a las lecturas concurrentes en uno o incluso varios archivos, la respuesta es que necesita seguridad de subprocesos ( https://www.hdfgroup.org/hdf5-quest.html#tsafe
):
El acceso simultáneo a uno o más archivos HDF5 de varios subprocesos en el mismo proceso no funcionará con una compilación no segura para subprocesos de la biblioteca HDF5. Los binarios precompilados que están disponibles para descargar no son seguros para subprocesos.
Los usuarios a menudo se sorprenden al saber que (1) el acceso simultáneo a diferentes conjuntos de datos en un solo archivo HDF5 y (2) el acceso simultáneo a diferentes archivos HDF5 requieren una versión segura de subprocesos de la biblioteca HDF5 . Aunque cada hilo de estos ejemplos está accediendo a datos diferentes, la biblioteca HDF5 modifica las estructuras de datos globales que son independientes de un conjunto de datos HDF5 o archivo HDF5 en particular . HDF5 se basa en un semáforo alrededor de las llamadas a la API de la biblioteca en la versión segura de subprocesos de la biblioteca para proteger la estructura de datos contra la corrupción mediante la manipulación simultánea de diferentes subprocesos. Ejemplos de estructuras de datos globales de la biblioteca HDF5 que deben protegerse son el administrador del espacio libre y las listas de archivos abiertas.
Edición: los enlaces anteriores ya no funcionan porque el Grupo HDF reorganizó su sitio web. Hay una página "Preguntas sobre seguridad de subprocesos y acceso simultáneo" en la Base de conocimientos de HDF5 que contiene información útil.
Si bien solo se mencionan subprocesos concurrentes en un solo proceso en el pasaje, parece que se aplica igualmente a los subprocesos bifurcados: vea este ejemplo de multiprocesamiento en h5py.
Ahora, para el acceso paralelo , es posible que desee utilizar "HDF5 paralelo", pero esas funciones requieren el uso de MPI. Este patrón es compatible con h5py pero es más complicado y esotérico, y probablemente menos portátil que el modo seguro para subprocesos. Más importante aún, tratar de hacer ingenuamente las lecturas simultáneas con una compilación paralela de libhdf5 dará lugar a resultados inesperados porque la biblioteca no es segura para subprocesos .
Además de la eficiencia, una limitación de la marca de construcción segura para subprocesos es la falta de soporte de Windows ( https://www.hdfgroup.org/hdf5-quest.html#gconc
):
La versión segura de subprocesos de HDF5 actualmente no se ha probado ni es compatible con las plataformas de MS Windows. Un usuario pudo hacer que esto funcionara en Windows de 64 bits y contribuyó con sus parches de Pthreads de Windows de 64 bits.
Obtener resultados extraños y corruptos al leer (¡diferentes!) Archivos de Python es definitivamente inesperado y frustrante, dado que el acceso de lectura concurrente es una de las "características" promocionadas de HDF5. Tal vez una mejor receta predeterminada para conda sería incluir --enable-threadsafe
en las plataformas que lo admiten, pero supongo que entonces terminarías con un comportamiento específico de la plataforma. Tal vez debería haber paquetes separados para los tres modos de construcción en su lugar?
Estoy tratando de entender los límites de la concurrencia hdf5.
Hay dos versiones de hdf5: HDF5 paralela y predeterminada . La versión paralela se suministra actualmente en Ubuntu, y la predeterminada en Anaconda (juzgada por el indicador "--enable-parallel").
Sé que las escrituras paralelas al mismo archivo son imposibles. Sin embargo, no entiendo completamente hasta qué punto son posibles las siguientes acciones con la construcción predeterminada o en paralelo:
- Varios procesos de lectura desde el mismo archivo.
- Varios procesos de lectura desde diferentes archivos.
- Varios procesos de escritura a diferentes archivos.
Además, ¿hay alguna razón por la que anaconda no tenga activada la opción de habilitación paralela? ( https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh )
Solo para agregar: creo que los procesos simultáneos independientes (es decir, Python) que realizan el acceso de lectura deberían estar fine
HDF5 1.10 será compatible con Single Writer Multiple Reader , más información y también h5py 2.5.0 tendrá support para ello