Hace más de un año informé de un error que encontré al recopilar algunos datos bastante complejos. En ese momento no sabía cuál era el problema y creía que podría haber tenido algo que ver con las referencias recursivas.
Me encontré con el problema varias veces mientras trabajaba en mi proyecto, pero solo hice cosas arbitrarias para intentar solucionarlo hasta que desapareció el error. Ahora finalmente me tomé el tiempo para concentrarme en la fuente del problema y refinar mi MWE. Esto es lo que se me ocurrió:
import pickle import numpy as np # create data dtypes = [('f0', 'O')] # for some reason, I need at least an extra of 19 fields for it to crash # immediately dtypes += [(f'f{i+1}', 'i4') for i in range(19)] data = np.empty(1, dtype=dtypes) # print(data[0]) # dump data dump = pickle.dumps(data[0], pickle.HIGHEST_PROTOCOL) # print('dumping works') # load data load = pickle.loads(dump) # print('loading works') # process crashes here if len(dtypes) > 19 print(load) # process prints random data, eg # (((...), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 0, 0, # -1931060898, 32763, 1472326776, 503, 1482667496, 503, 0, 0, 1484270024, # 503, 1472326776, 503, -1930803631, 32763, 1484270024, 503) # or # ((((((...), False, True), False, True), dtype('int32'), None), 0, 0), 0, 0) # or # (((...), <cell at 0x0000017018A25888: str object at 0x000001701AF998F0>, # <cell at 0x0000017019084498: bool object at 0x00007FFB8D0EA970>, # <cell at 0x00000170190842B8: int object at 0x00007FFB8D16A270>, # <cell at 0x000001701927E2E8: str object at 0x0000017018989BB0>, # <cell at 0x0000017018A3E798: bool object at 0x00007FFB8D0EA970>), # 0, 0, -1931060898, 32763, 451341512) # and crashes immediately afterwards if 2 <= len(dtypes) <= 19. # process finishes with exit code 0 if data has no additional fields except f0, # and prints # (((...),),)Ahora soy consciente de que se han informado problemas similares en el pasado:
decapado/decapado de numpy.void y numpy.record para multiprocesamiento
Error de segmentación con numpy.void y pickle
Python: el decapado falla para los objetos numpy.void
Y en un caso bastante reciente y muy similar
Segfault después de cargar objetos vacíos decapados
Parece que se ha introducido una solución , sin embargo, mi código aún provoca un bloqueo:
Process finished with exit code -1073741819 (0xC0000005)Ahora, para Python: el decapado falla para los objetos numpy.void , la respuesta aceptada es un comentario de jottos (29 de diciembre de 2009 a las 18:42):
por lo tanto, el decapado solo funcionará con funciones y clases de módulo de nivel superior, y no decapará datos de clase, por lo que si se requieren algunos códigos/datos de clase numpy para producir una representación del tipo de vacío numpy, el decapado no funcionará como se esperaba. Puede ser que el paquete numpy haya implementado una repr interna para imprimir el tipo vacío como una tupla, si este es el caso, lo que decapaste ciertamente no será lo que imprimiste.
Pero esto es de hace más de diez años, y parece que desde entonces se han introducido correcciones de errores. Entonces, ¿sigue siendo eso lo que está pasando aquí, o es algo más? Especialmente porque mi código muestra un comportamiento tan arbitrario.
Windows : 10 Home, versión 21H1, compilación 19043.1288
PyCharm : 2021.2 (Profesional), compilación #PY-212.4746.96
Python (a través de anaconda): 3.7.7 [MSC v.1916 64 bits (AMD64)]
Numpy : 1.19.2
Encurtido : 4.0