Saltar al contenido

¿Cuál es la ventaja de guardar archivos `.npz` en lugar de `.npy` en python, con respecto a la velocidad, la memoria y la búsqueda?

Necesitamos tu ayuda para compartir nuestras crónicas sobre las ciencias informáticas.

Solución:

Hay dos partes de explicación para responder a su pregunta.

I. NPY frente a NPZ

Como ya leímos en el documento, el .npy el formato es:

el formato de archivo binario estándar en NumPy para persistir un soltero número arbitrario array en disco … El formato está diseñado para ser lo más simple posible mientras logra sus objetivos limitados. (fuentes)

Y .npz es solo un

forma sencilla de combinar múltiple arreglos en un solo archivo, uno puede usar ZipFile para contener múltiples “.npy” archivos. Recomendamos usar la extensión de archivo “.npz” para estos archivos. (fuentes)

Asi que, .npz es solo un ZipFile que contiene múltiples “.npy” archivos. Y este ZipFile puede ser ya sea comprimido (usando np.savez_compressed) o sin comprimir (usando np.savez).

Es similar al archivo tarball en un sistema similar a Unix, donde un archivo tarball puede ser solo un archivo sin comprimir que contiene otros archivos o un archivo comprimido al combinarlo con varios programas de compresión (gzip, bzip2etc.)

II. Diferentes API para serialización binaria

Y Numpy también proporciona diferentes API para producir estos archivos binarios:

  • np.save —> Guardar un array a un archivo binario en NumPy .npy formato
  • np.savez –> Guarde varias matrices en un solo archivo en sin comprimir.npz formato
  • np.savez_compressed –> Guarde varias matrices en un solo archivo en comprimido.npz formato
  • np.load –> Cargar arreglos u objetos decapados desde .npy, .npz o archivos en escabeche

Si hojeamos el código fuente de Numpy, debajo del capó, hay:

def _savez(file, args, kwds, compress, allow_pickle=True, pickle_kwargs=None):
    ...
    if compress:
        compression = zipfile.ZIP_DEFLATED
    else:
        compression = zipfile.ZIP_STORED
    ...


def savez(file, *args, **kwds):
    _savez(file, args, kwds, False)


def savez_compressed(file, *args, **kwds):
    _savez(file, args, kwds, True)

Entonces volvamos a la pregunta:

Si solo uso np.saveno hay más compresión en la parte superior de la .npy formato, solo un único archivo de almacenamiento para la conveniencia de administrar múltiples archivos relacionados.

si uso np.savez_compressedluego, por supuesto, menos memoria en el disco debido a más tiempo de CPU para realizar el trabajo de compresión (es decir, un poco más lento).

La principal ventaja es que las matrices tienen carga diferida. Es decir, si tienes un npz archivo con 100 matrices, puede cargar el archivo sin cargar ninguno de los datos. Si pides una sola arraysolo los datos para eso array está cargado.

Una desventaja para npz archivos es que no pueden ser mapeados en memoria (usando load(, mmap_mode='r')), por lo que para arreglos grandes puede que no sean la mejor opción. Para los datos en los que las matrices tienen una forma común, sugiero echar un vistazo a las matrices estructuradas. Estos pueden ser mapeados en memoria, permiten acceder a datos con sintaxis similar a dict (es decir, arr['field']), y son muy eficientes en cuanto a memoria.

Sección de Reseñas y Valoraciones

Si crees que ha resultado de provecho este post, te agradeceríamos que lo compartas con más juniors de esta manera nos ayudas a dar difusión a nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *