24

我有一个非常大的文件,我试图用 mmap 打开它,但它给我的权限被拒绝。我尝试了不同的标志和模式,os.open但它对我不起作用。

我究竟做错了什么?

>>> import os,mmap
>>> mfd = os.open('BigFile', 0)
>>> mfile = mmap.mmap(mfd, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
mmap.error: [Errno 13] Permission denied
>>> 

(通过python docs示例使用内置open()作品,但它似乎在读写模式下都打开了多个文件句柄。我需要的mmap.mmap方法是文件号,所以我不认为我需要创建一个file对象;因此我尝试使用os.open()

4

4 回答 4

39

我认为这是一个标志问题,尝试以只读方式打开:

mfd = os.open('BigFile', os.O_RDONLY)

并且 mmap.mmap 默认尝试映射读/写,所以只映射只读:

mfile = mmap.mmap(mfd, 0, prot=mmap.PROT_READ)
于 2011-06-08T23:56:54.227 回答
12

尝试将文件模式设置为r+. 这在 Linux 上对我有用:

mfd = os.open('BigFile', "r+")

然后这对我正常工作:

mfile = mmap.mmap(mfd, 0)
于 2013-01-19T22:44:34.907 回答
5

就我而言,发生此错误是因为我试图在未指定明确大小的情况下打开块设备。

FWIW 您不能将os.stat/os.fstat与块设备一起使用来获取设备的大小(始终为 0),但您可以使用file.seekand file.tell

f = file("/dev/loop0", "rb")
f.seek(0, 2)  # Seek relative to end of file
size = f.tell()
fh = f.fileno()

m = mmap.mmap(f, size, mmap.MAP_PRIVATE, mmap.PROT_READ)
于 2012-02-11T20:36:01.277 回答
2

可以使用参数进行跨平台调用:mmapaccess

mfd = os.open('BigFile', os.O_RDONLY)
mm = mmap.mmap(mfd, 0, access=mmap.ACCESS_READ)

mmap 构造权限应与文件打开权限(读、写或读/写)同步。

于 2016-01-01T23:31:27.797 回答