为什么 Python 的 mmap 不能处理大文件?

2023-12-27

[编辑:此问题仅适用于 32 位系统。如果您的计算机、操作系统和 python 实现都是 64 位的,那么 mmap-ing 大文件可以可靠地工作并且非常高效。]

我正在编写一个模块,除其他外,它允许对文件进行按位读取访问。这些文件可能很大(数百 GB),因此我编写了一个简单的类,让我将文件视为字符串并隐藏所有查找和读取。

当我写我的包装类时,我不知道映射模块 http://docs.python.org/library/mmap.html。在阅读 mmap 的文档时,我想“太棒了 - 这正是我所需要的,我将取出我的代码并将其替换为 mmap。它可能会更有效,并且删除代码总是好的。”

问题是 mmap 不适用于大文件!这让我感到非常惊讶,因为我认为这可能是最明显的应用。如果文件超过几千兆字节,那么我会得到一个EnvironmentError: [Errno 12] Cannot allocate memory。这种情况仅发生在 32 位 Python 构建中,因此它似乎耗尽了地址空间,但我找不到任何相关文档。

我的代码只是

f = open('somelargefile', 'rb')
map = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)

所以我的问题是我在这里遗漏了一些明显的东西吗?有没有办法让 mmap 在大文件上可移植地工作,或者我应该回到我的天真的文件包装器?


更新:似乎有一种感觉,Python mmap 应该具有与 POSIX mmap 相同的限制。为了更好地表达我的挫败感,这里有一个简单的类,它具有 mmap 的一小部分功能。

import os

class Mmap(object):
    def __init__(self, f):
        """Initialise with a file object."""
        self.source = f

    def __getitem__(self, key):
        try:
            # A slice
            self.source.seek(key.start, os.SEEK_SET)
            return self.source.read(key.stop - key.start)
        except AttributeError:
            # single element
            self.source.seek(key, os.SEEK_SET)
            return self.source.read(1)

它是只读的,不会做任何花哨的事情,但我可以像使用 mmap 一样执行此操作:

map2 = Mmap(f)
print map2[0:10]
print map2[10000000000:10000000010]

除了对文件大小没有限制之外。其实不是太难...


来自 IEEE 1003.1:

mmap() 函数应建立一个 进程地址之间的映射 空间和文件,共享内存 对象,或 [TYM] 类型的内存 目的。

它需要所有虚拟地址空间,因为这正是mmap() does.

事实并非如此really内存不足并不重要 - 您无法映射比可用地址空间更多的地址空间。因为您随后获取结果并访问,就好像它一样were内存,您究竟建议如何访问文件中超过 2^32 字节的内容?即使mmap()没有失败,在 32 位地址空间空间耗尽之前,您仍然只能读取前 4GB。当然,你可以mmap()文件上的滑动 32 位窗口,但这不一定会给您带来任何好处,除非您可以优化您的访问模式,从而限制必须访问先前窗口的次数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Python 的 mmap 不能处理大文件? 的相关文章

  • 如何在 Django Admin 的“更改”页面中显示内嵌上传的图像?

    我正在尝试在中显示内联上传的图像 变更列表 页面在 Django 管理中 这是我的代码如下 models py from django db import models class Product models Model name mod
  • pandas python 根据一个或多个其他列的子集更新 A 列的子集

    Edit我修改了下面的部分描述 以澄清 功能 和 组 的含义 修复拼写错误 并包含我尝试过的其他代码 我的熊猫df有 450 万行和 23 列 下表显示了几行df2这是从生成的df 它显示了两组 eeskin and hduquant 和三
  • AttributeError:模块“tensorflow.python.framework.ops”没有属性“RegisterShape”

    我正在使用 TensorFlow 2 1 0 dev20191125 不幸的是 我无法编译一个带有错误的简单示例 AttributeError 模块 tensorflow python framework ops 没有 属性 Registe
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • 使用 pygtk3 将 GUI 窗口添加到 python opencv2 程序

    我已经使用Python和Opencv2完成了一个程序 现在 我想向我的程序添加一个 GUI 窗口 我对 PyGtk3 有一些经验 因此 我修改了代码以采用 PyGtk3 但是 我遇到了错误 因此 我尝试了一个简单的程序来找出实际的错误 我的
  • 计算 for 循环期间的运行总计 - Python

    编辑 下面是我根据收到的反馈 答案编写的工作代码 这个问题源于我之前使用 MIT 的开放课件学习 Python CS 时提出的问题 在这里查看我之前的问题 https stackoverflow com questions 4990159
  • 预处理 csv 文件以与 tflearn 一起使用

    我的问题是关于在将 csv 文件输入神经网络之前对其进行预处理 我想使用 python 3 中的 tflearn 为著名的 iris 数据集构建一个深度神经网络 数据集 http archive ics uci edu ml machine
  • 使用opencv+picamera流IO用树莓派捕获视频

    我使用 Raspberry 来简单地显示一个视频 目前仅此 为此 我必须使用 opencv cv2 我尝试了很多解决方案 但现在我想使用 Picamera 库捕获视频 我将向您展示我的代码 import io import time imp
  • 生产环境的 Flask-Login 与 Flask-Security

    我正在构建一个功能 供用户注册 登录 验证和授权自己 特别是使用 Python Flask 作为后端 我找到了一些解决方案 例如flask login and flask security 据我了解 flask login实际上并没有进行任
  • 自定义信号的声明

    在 Qt 中 我们可以通过将自定义信号设为静态变量来创建它们 然后我们使用self signame反而classname signame 这样就在类中创建了一个实例变量 我想了解这种模式之外的理论 这是我尝试过的一些伪代码 这些伪代码已记录
  • 在 PyCharm 中运行命令行命令

    你好 我正在使用Python 但之前从未真正使用过它 我收到一些命令 需要在终端中运行 基本上 python Test py GET feeds 我正在使用 PyCharm 我想知道是否有办法从该 IDE 中运行这些相同的命令 按 Alt
  • iOS 自定义单元格设计放在哪里? awakeFromNib 还是 cellForRowAtIndexPath?

    所以 基本上我用笔尖做了一个定制单元 希望我应用一些定制设计 比如颜色和阴影 我发现了两种应用样式的方法 awakeFromNib override func awakeFromNib super awakeFromNib Containe
  • 使用主宰器将实时数据发送给客户端

    我尝试使用 Flask 的主宰框架 以便按照 Flask 代码片段将实时信息发送到客户端浏览器http flask pocoo org snippets 80 http flask pocoo org snippets 80 当我尝试为我的
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • python 和 android 中通过 AES 算法加密和解密

    我有用于 AES 加密的 python 和 android 代码 当我在android中加密文本时 它在python上成功解密 但无法在android端解密 有人有想法吗 Python代码 import base64 import hash
  • Mac 上的 Errno 13 权限被拒绝

    我只是测试如何从一个 py 文件调用外部 py 文件 我有 2 个 py 文件 都在同一目录中 这是主要代码 runext py 假设调用 ext py import subprocess subprocess call Users tra
  • 如何使用 Python Pandas 制作 DataFrame 切片并在特定切片中“fillna”?

    问题 让我们从 Kaggle 获取泰坦尼克号数据集 我有包含 Pclass 性别 和 年龄 列的数据框 我需要用特定组的中位数填充 年龄 列中的 NaN 如果是来自一等的女性 我想用一等女性的中位数填写她的年龄 而不是整个年龄列的中位数 问
  • 使用多行选项和编码选项读取 CSV

    在 azure Databricks 中 当我使用以下命令读取 CSV 文件时multiline true and encoding SJIS 似乎编码选项被忽略了 如果我使用multiline选项 Spark 使用默认值encoding那
  • 在 Mac (Catalina) 上安装 PyGame 时出错 [重复]

    这个问题在这里已经有答案了 我一直在尝试将 PyGame 安装到 Catalina 上的 Mac 上 但不知道如何安装 我收到的错误消息是 SystemExit error command gcc failed with exit stat
  • Scrapy - 持续从数据库中获取要爬取的url

    我想不断地从数据库中获取要爬行的网址 到目前为止 我成功地从基地获取了 url 但我希望我的蜘蛛继续从该基地读取 因为该表将由另一个线程填充 我有一个管道 一旦爬行 工作 就会从表中删除 url 换句话说 我想使用我的数据库作为队列 我尝试

随机推荐