我想用cython從一些二進制文件中提取數據,但是我遇到了一個問題,我對cython/c的知識無法解決它。c數組結構的cython內存視圖
問題: 試圖對我的c數組結構進行內存視圖導致分段錯誤。
我在做什麼: 我有一個充滿數據的二進制文件,第一個條目是一個無符號整數,給出文件中包含的快照數量(Snapshot_Counter)。 下一個條目採用Snapshot_Information格式,並且此塊重複執行Snapshot_Counter次。 如果我在循環中逐塊讀取它,將結果存儲在它的工作列表中,並獲得正確的數字。
我想通過一次讀取數組來避免這個循環。 我想提取Snapshot_Information格式信息到一個數組中,我想我已經設法正確地分配。然而,我不知道如何查看數組,以檢查是否有正確的數據。 我覺得這是錯誤的,因爲我在這個塊之後提取的數字是錯誤的。我想知道: 我怎樣才能看到這個數組與內存視圖?我是否正確地分配內存?有沒有一個C數組做這個的另一種方法?
代碼:
in extractiontest.pxd
cdef unsigned int Snapshot_Counter
cdef packed struct Snapshot_Information:
signed int Days
unsigned int Seconds
...more type definitions.
in extractiontest.pyx
rm = fopen("/filepath")
fread(&Snapshot_Counter,4,1,rm) #works fine
cdef Snapshot_Information *snap_info_array = <Snapshot_Information *>malloc(Snapshot_Counter*sizeof(Snapshot_Information))
fread(&snap_info_array, sizeof(Snapshot_Information), Snapshot_Counter, rm)
cdef Snapshot_Information[:] snap_arr_view = <Snapshot_Information[:-1]>snap_info_array
感謝DavidW,我設法讓它提取memoryview,然後使用np.asarray(snap_array_view)我可以看到它是Snapshot_Counter長。可悲的是,如果我嘗試打印它,我會遇到一個seg故障!所以我懷疑我沒有達到問題的底部。 –
@RDavies請參閱編輯。我不想承諾這是唯一的其他問題,但它確實是一個問題 – DavidW
優秀,似乎已經修復它。我是新來的指針/地址的東西。謝謝你的明確解釋。 它與一起工作,數組名前面沒有任何內容。 –