2016-12-12 65 views
1

我正在嘗試使用os.open,mmapfrom_buffer()來讀取大型二進制文件(> 5 GB)。對於編寫和閱讀大文件而言是開放的Python

運行fd = os.open(filePath, O_RDWR)錯誤OSError: [Errno 22] Invalid argument: H:\\xyz.wdp引發。我意識到問題在於文件太大,因爲使用類似但較小的文件,O_WRONLYO_RDONLY,它的工作。 不幸的是,如果我使用O_WRONLYO_RDONLY,則from_buffer()函數(TypeError: mmap can't modify a readonly memory map.)的訪問被拒絕。

我的示例代碼:

class StructData(Structure): 
    _pack_ = 1 
    _fields_ = [('bin', c_ubyte)] 

fd = os.open(filePath, os.O_RDWR) 
mmap_file = mmap.mmap(fd, length=80, access=mmap.ACCESS_WRITE, offset=0) 
d_array = StructData*80 
data = d_array.from_buffer(mmap_file) 

你能幫我解決這個問題?我想添加我使用大型文件的工作,並且我需要它運行得非常快,我想避免使用struct.unpack等。

謝謝!

+0

如何[MCVE(HTTP://計算器.COM /幫助/ MCVE)? –

+0

沒有更多的信息,很難弄清楚你的問題。但是,似乎filePath變量有一個語法錯誤,所以如果你寫了你正在存儲的內容,這將是非常有用的。 – Jalo

+0

我用示例代碼更新了我的問題 – Pablo

回答

1

從路徑看起來好像你正在使用Windows。 文檔(https://docs.python.org/2/library/os.html#os.open)表示應該使用os.O_BINARY在Windows上以二進制模式打開文件。 你有沒有試過以下? (如果你可能會創建文件...)

fd = os.open(filePath, os.O_RDWR | os.O_CREAT | os.O_TRUNC | os.O_BINARY) 

我不知道大文件支持Windows中的情況: https://docs.python.org/2/library/posix.html

+0

是啊!有效!在我的情況下,我不創建一個新文件,我只是讀它,但'from_buffer()'不能只用'os.O_RDONLY'。然後我使用了'os.O_RDWR | os.O_BINARY',它的工作! mmap訪問也在'mmap.ACCESS_WRITE'中也很重要。謝謝! – Pablo