Pickle Cython Class com ponteiros C
Estou tentando escrever um__reduce__()
método para uma classe cython que contém ponteiros C, mas até agora encontraram muito poucas informações sobre a melhor maneira de fazer isso. Existem muitos exemplos de como escrever corretamente um__reduce__()
ao usar matrizes numpy como dados do membro. Gostaria de ficar longe das matrizes Numpy, pois elas sempre parecem armazenadas como objetos python e exigem chamadas para e da API python. Eu sou do segundo plano C, por isso estou muito confortável trabalhando com a memória manualmente usando chamadas paramalloc()
efree()
e estou tentando manter a interação python no mínimo absoluto.
No entanto, encontrei um problema. Eu preciso usar algo equivalente acopy.deepcopy()
na classe que estou criando, a partir do script Python, onde será finalmente usado. Eu descobri que a única maneira de fazer isso é implementar o protocolo pickle para a classe implementando um__reduce__()
método. Isso é trivial com a maioria dos objetos primitivos ou python. No entanto, estou absolutamente perdido para saber como fazer isso para matrizes C alocadas dinamicamente. Obviamente, não posso devolver o ponteiro em si, pois a memória subjacente desapareceu no momento em que o objeto é reconstruído, então qual é a melhor maneira de fazer isso? Tenho certeza de que isso exigirá modificação de ambos os__reduce__()
método, bem como um ou ambos os__init__()
métodos.
Eu li a documentação do python sobre tipos de extensão de decapagemencontrado aqui bem como quase todas as outras questões de estouro de pilha sobre a escolha de classes cython, comoessa questão.
Uma versão condensada da minha classe é mais ou menos assim:
cdef class Bin:
cdef int* job_ids
cdef int* jobs
cdef int primitive_data
def __cinit__(self):
self.job_ids = <int*>malloc(40 * sizeof(int))
self.jobs = <int*>malloc(40 * sizeof(int))
def __init__(self, int val):
self.primitive_data = val
def __dealloc__(self):
free(job_ids)
free(jobs)
def __reduce__(self):
return (self.__class__, (self.primitive_data))