2017-09-04 3 views
1

Donc, mon problème est que j'essaie de convertir des données d'image en tableau continu pour le transmettre à la bibliothèque C, mais pour une raison quelconque, numpy donne un défaut de segmentation sur un tableau trop long. Regardez l'exempleEssayer de convertir numpy array avec ctypes en C donne défaut Segmentation

data = np.ascontiguousarray(np.array([1]*10000, dtype=np.float32)/255).ctypes.data_as(POINTER(c_float)) 
print data.contents.value # ok 

data = np.ascontiguousarray(np.array([1]*1000000, dtype=np.float32)/255).ctypes.data_as(POINTER(c_float)) 
print data.contents.value #giving segmentation fault 
+0

Je ne connais pas ces bibliothèques, mais il est possible que vous ayez trouvé un bogue dans numpy. – Retr0id

Répondre

1

Je crois qu'il est parce que votre construction d'une ligne, l'objet tableau numpy n'a pas de références tenues à elle, donc il est ramasse-miettes, alors vous essayez de déréférencer un pointeur ballants . J'ai essayé votre code et évité le segfault en brisant la ligne en deux - une ligne pour créer le tableau numpy, puis une seconde pour obtenir le pointeur dans le stockage sous-jacent:

x = np.ascontiguousarray(np.array([1]*10000000, dtype=np.float32)/255) 
data = x.ctypes.data_as(POINTER(c_float)) 
print data.contents.value # no more segmentation fault 

Je suppose que le bloc de mémoire plus grande est plus agressivement recueillies, d'où la différence de comportement en fonction de la taille. J'ai également dû augmenter la taille de la mémoire pour obtenir une erreur de segmentation sur ma machine.