es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La serialización de xarray no es posible: no se puede serializar el objeto ‘_thread.lock’.

Me estoy encontrando con un problema al hacer pickle de un xarray y no logro entender cuál es el problema.

import xarray as xr
import pickle
ds = xr.open_dataset('62030_prec_1995.nc')
pkl = pickle.dumps(ds, protocol=-1)

Esto resulta en el mensaje de error:

Traceback (most recent call last):
  File "C:\Users\xxx\Miniconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3441, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-14-08c3b812c30c>", line 1, in <module>
    pkl = pickle.dumps(ds, protocol=-1)
TypeError: no se puede hacer pickle del objeto 'lock' de '_thread'

Si ejecuto ds.info(), me muestra la siguiente información del archivo:

ds.info()
xarray.Dataset {
dimensions:
time = 365 ;
bnds = 2 ;
rlon = 848 ;
rlat = 824 ;
variables:
datetime64[ns] time(time) ;
time:standard_name = time ;
time:bounds = time_bnds ;
time:axis = T ;
datetime64[ns] time_bnds(time, bnds) ;
float64 rlon(rlon) ;
rlon:standard_name = projection_x_coordinate ;
rlon:long_name = longitude in rotated pole grid ;
rlon:units = degrees ;
rlon:axis = X ;
float64 rlat(rlat) ;
rlat:standard_name = projection_y_coordinate ;
rlat:long_name = latitude in rotated pole grid ;
rlat:units = degrees ;
rlat:axis = Y ;
int32 rotated_pole() ;
rotated_pole:grid_mapping_name = rotated_latitude_longitude ;
rotated_pole:grid_north_pole_longitude = -162.0 ;
rotated_pole:grid_north_pole_latitude = 39.25 ;
float32 prec(time, rlat, rlon) ;
prec:code = 260 ;
prec:table = 2 ;
prec:grid_mapping = rotated_pole ;
prec:cell_methods = time: mean ;
// global attributes:
:CDI = Climate Data Interface version 1.9.10 (https://mpimet.mpg.de/cdi) ;
:Conventions = CF-1.6 ;
}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “no se puede serializar el objeto ‘_thread.lock'” significa que hay algún objeto relacionado con el módulo de threading que no se puede serializar.

    Una solución a este problema podría ser utilizar la biblioteca Dask para paralelizar las operaciones de E/S al abrir el conjunto de datos xarray. Otra solución es utilizar una versión inferior del protocolo al serializar el conjunto de datos, ya que los niveles inferiores del protocolo no incluyen tipos más complejos como los bloqueos. Por ejemplo, se podría utilizar el protocolo 2:

    pkl = pickle.dumps(ds, protocol=2)
    

    Vale la pena mencionar que cuanto más bajo sea el número de protocolo, menos eficiente será el proceso de serialización/deserialización. Sin embargo, en este caso particular, la diferencia de rendimiento puede que no sea significativa.

Comments are closed.