2014-01-15 32 views
2

我想創建一個內存映射文件這樣爲什麼我無法使用已知大小的mmap創建新文件?

size = 83456 
self.file = open("/tmp/installer.ipk", "r+b") 
self.mm = mmap.mmap(self.file.fileno(), size, access=mmap.ACCESS_WRITE) 

,但我得到下面的異常

Traceback (most recent call last): 
    ... 
    File "./dept_sensor_service.py", line 70, in handle_control 
    self.mm = mmap.mmap(self.file.fileno(), size, access=mmap.ACCESS_WRITE) 
ValueError: mmap length is greater than file size 

文件/tmp/installer.ipk我跑在這之前不存在。我希望腳本創建一個名爲/tmp/installer.ipk的文件並填充83456個零。據爲mmap Python文檔:

如果長度大於文件的當前大小,文件擴展爲包含 長度字節

我曾與各種權限玩耍了,但我認爲'r+b'爲文件,ACCESS_WRITE爲地圖將是正確的。

這是在一個beaglebone Linux機器上。順便說一句,我會用with open(...) as f:模式,但我不能在這種情況下,因爲mmap必須在函數返回後保持打開狀態。

回答

2

MMAP不會自動增加文件的Unix版本,但是你可以將零寫入該文件自己,是這樣的:

size = 83456 
self.file = open("/tmp/installer.ipk", "w+b") 
self.file.write("\0" * size) 
self.file.flush() 
self.mm = mmap.mmap(self.file.fileno(), size, access=mmap.ACCESS_WRITE) 
+0

謝謝。我重讀了文檔,並意識到我正在閱讀Windows部分。下面是將文件寫入固定大小的另一種方式,這應該是更快一點:http://stackoverflow.com/questions/8816059/create-file-of-particular-size-in-python –

+0

@MarkLakata這是一個很好的技巧,謝謝分享。 –

相關問題