2017-05-30 106 views
0

我正在將一個二進制文件映射到具有自定義dtype的內存。我不喜歡這樣寫道:numpy memmap忽略EOF錯誤

np.memmap(filename=f, dtype=my_sample_dtype, mode='r') 

有時,二進制文件的末尾砍掉,因爲寫的過程中它意外結束。在這種情況下,numpy的抱怨:

ValueError: Size of available data is not a multiple of the data-type size. 

現在我可以截斷磁盤上的文件,使其數據類型大小的倍數,但我想,不需要觸摸原始文件的解決方案。我可以告訴numpy忽略文件末尾的不完整元素嗎?

+0

爲什麼你不想修改磁盤上的文件來修復它?任何修復寫入損壞記錄的程序的機會? –

+0

文件每個都有幾GB,並存儲在只讀位置。另一個程序由於電源故障停止寫入,所以它不是bug。該軟件需要對這種失敗具有強大的功能。 – rudolfbyker

+0

你知道數組應該是什麼形狀(至少'dims-1')嗎? –

回答

1

答案是在np.memmap documentation右邊有:

形狀元組,可選

陣列的期望的形狀。如果mode =='r'以及offset之後的剩餘字節數不是dtype的字節大小的倍數,則必須指定形狀。

因此,只需使用常規Python函數來獲取文件大小,找出文件包含多少個完整元素,並將其作爲shape傳遞。你得到的例外將不再發生。很容易明白爲什麼如果您查看源代碼:https://github.com/numpy/numpy/blob/ab49be1/numpy/core/memmap.py - 只有在shape is None時纔會拋出異常。

+1

您可以使用'os.stat(f).st_size'來獲取文件大小 –