使用mmap增加文件大小

6
在Windows上使用Python可以通过以下方式创建一个大文件:
    from mmap import mmap
    f = open('big.file', 'w')
    f.close()
    f = open('big.file', 'r+')
    m = mmap(f.fileno(), 10**9)

现在big.file的大小约为1GB。但是在Linux上,这将返回ValueError: mmap length is greater than file size

有没有一种方法可以在Linux上像Windows一样实现相同的行为?也就是说,能够使用mmap增加文件的大小吗?


我知道已经有一段时间了,但你尝试过mmap的resize方法吗? - iruvar
1个回答

6
在至少POSIX系统上, mmap()无法用于增加(或减小)文件的大小。 mmap()的功能是将文件的一部分映射到内存中。您要请求映射的东西实际上应该存在!坦白说,我真的很惊讶在MS Windows下您实际上能够做到这一点。
如果您想要增加文件,则只需在mmap()之前对其进行ftruncate()即可。

哦,那很有用,因为您也可以缩短文件。现在我希望Windows也有"ftruncate()"! - chew socks
我应该说,我是基于Python文档而不是任何Windows文档来发表这个声明的。 - chew socks
4
将来阅读此文的任何人,文件对象还具有“truncate()”方法,其类似于“os.ftruncte()”,但可在Windows和Unix上使用。这很有用,因为Pypy在Windows上也具有像Unix一样增大内存映射文件的行为。 - chew socks
@chewsocks:对于未来阅读更多内容的人,Python 3.5增加了对os.ftruncate(以及os.truncate)的支持,因此您可以使用任何一个有意义的方法(如果您已经拥有文件对象,则使用truncate方法,如果您只有文件描述符,则使用os.truncate/os.ftruncate)。 - ShadowRanger
ftruncate然后重新映射是否被认为是线程/进程安全的? - TomSawyer
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接