使用 mmap 将正则表达式应用于整个文件

2024-06-11

我正在尝试使用以下代码将正则表达式应用于整个文件(不仅仅是每一行):

import mmap, re

ifile = open(ifilename)
data = mmap.mmap(ifile.fileno(), 0)
print data
mo = re.search('error: (.*)', data)
if mo:
    print "found error"

这是基于问题的答案如何重新搜索或重新匹配整个文件而不将其全部读入内存? https://stackoverflow.com/questions/454456/how-do-i-re-search-or-re-match-on-a-whole-file-without-reading-it-all-into-memor

但我收到以下错误:

Traceback (most recent call last):
  File "./myscript.py", line 29, in ?
    mo = re.search('error: (.*)', data)
  File "/usr/lib/python2.3/sre.py", line 137, in search
    return _compile(pattern, flags).search(string)
TypeError: expected string or buffer

我该如何解决这个问题?


在问题中匹配文件对象中的多行正则表达式 https://stackoverflow.com/questions/2433648/match-multiline-regex-in-file-object,我发现读取整个文件的另一种可能性如下,而不是 mmap 对象:

data = open("data.txt").read()

有任何理由选择mmap而不是简单的缓冲区/字符串?


你确实有两个问题埋在这里。

您的技术问题

如果您升级到较新版本的 Python,您面临的问题很可能会得到解决,或者您至少应该获得更好的回溯。这映射文档 https://docs.python.org/2/library/mmap.html#module-mmap指定您需要打开一个文件进行更新以 mmap 它,但您当前没有这样做。

ifile = open(ifilename) # default is to open as read

应该是这样的:

ifile = open(ifilename, 'r+')

或者,如果您可以像您在评论中提到的那样更新到 Python 2.6,

with open(ifilename, 'r+') as fi:
    # do stuff with open file

如果您没有在 2.7 上打开具有写入权限的文件并尝试 mmap 它,则会引发“权限被拒绝”异常。我怀疑 2.3 中没有实现该错误,因此现在允许您继续使用无效的 mmap 对象,当您尝试使用正则表达式搜索该对象时,该对象会失败。

mmap 与 open().read()

最后,您将能够使用这两种方法做(几乎)相同的事情。re.search(pattern, mmap_or_long_string)将搜索您的内存映射文件或由read() call.

两种方法之间的主要区别在于虚拟内存与实内存消耗。 在内存映射文件中,文件保留在磁盘上(或任何位置),您可以通过虚拟内存地址直接访问它。当您使用以下方式读取文件时read(),您将整个文件一次性放入(真实)内存中。

为什么选择其中之一:

  1. 文件大小
    您可以映射的文件大小的最重要限制是虚拟内存地址空间的大小,这由您的 CPU(32 或 64 位)决定。不过,分配的内存必须是连续的,因此如果操作系统找不到足够大的块来分配内存,则可能会出现分配错误。使用时read(),另一方面,您的限制是可用的物理内存。如果您访问的文件大于可用内存并且无法读取单独的行,请考虑使用 mmap。

  2. 进程间文件共享
    如果要并行化大文件上的只读操作,则可以将其映射到内存中以在进程之间共享它,而不是每个进程读取整个文件的副本。

  3. 可读性/熟悉度
    很多人都熟悉简单的open() and read()函数比内存映射更重要。除非您有令人信服的理由使用 mmap,否则从长远来看,坚持使用基本 IO 函数可能会更好地实现可维护性。

  4. Speed
    这个是洗的。很多论坛和帖子喜欢谈论 mmap 速度(因为一旦文件映射,它就会绕过一些系统调用),但底层机制仍然是访问磁盘,而读取整个文件时会将所有内容都放入内存中,并且只执行磁盘操作在处理文件的开始和结束时访问。如果您尝试考虑缓存(硬盘和 CPU)、内存分页和文件访问模式,就会出现无限的复杂性。坚持使用经过验证的真实分析方法要容易得多。你will根据您的个人用例和文件访问模式查看不同的结果,因此对两者进行分析并查看哪一个对您来说更快。

其他资源

很好地总结了差异 http://www.pythoncentral.io/memory-mapped-mmap-file-support-in-python/
PyMOTW http://pymotw.com/2/mmap/
一个很好的问题 https://stackoverflow.com/q/1661986/2615940
维基百科虚拟内存文章 http://en.wikipedia.org/wiki/Virtual_memory

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

使用 mmap 将正则表达式应用于整个文件 的相关文章

  • async for 的语义等价物

    从相对于的文档async for根据 Python 3 5 中的语法 我发现引入它是为了迭代可等待的迭代器 不过 在描述之后的语义等价物中 我没有得到一些东西 iter ITER iter type iter aiter iter runn
  • pycharm自动将制表符转换为空格

    我正在使用 pycharm IDE 进行 python 开发 它对于 django 代码来说工作得很好 因此怀疑将制表符转换为空格是默认行为 但是在 python IDE 中到处都会出现错误 因为它无法自动将制表符转换为空格 有没有办法实现
  • 如何从 BNF 生成随机程序

    我知道我的问题听起来有点模糊 但我在网上找不到任何教程 我不是在寻求答案 而是寻求更多的解释 BNF 的一个例子
  • 从 git 安装时,我可以强制 pip 进行浅表签出吗?

    以下命令从 git 存储库安装 Python 包 pip install git ssh email protected cdn cgi l email protection username repo git Collecting git
  • 为什么 Sequence 是 mypy 中 + 不支持的操作数类型?

    mypy给出一个错误Sequence str 不是受支持的操作数类型 操作员 test py from typing import Sequence def test x Sequence str y Sequence str gt Seq
  • 以编程方式使用的免费单词列表? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 有效地将字符串(或元组)转换为 ctypes 数组

    我有一段代码 它采用 PIL 图像并将其转换为 ctypes 数组以传递给 C 函数 w px h px img size pixels struct unpack dI w px h px img convert RGBA tostrin
  • 为什么线性读-混洗写并不比混洗读-线性写快?

    我目前正在尝试更好地了解内存 缓存相关的性能问题 我在某处读到 内存局部性对于读取比对于写入更重要 因为在前一种情况下 CPU 必须实际等待数据 而在后一种情况下 它可以将它们发送出去并忘记它们 考虑到这一点 我做了以下快速而肮脏的测试 我
  • Python字典键(类对象)与多个比较器的比较

    我使用自定义对象作为 python 字典中的键 这些对象有一些默认值hash and eq定义的方法用于默认比较 但在某些功能中我需要使用不同的方式来比较这些对象 那么有什么方法可以覆盖或传递一个新的比较器来仅针对该特定函数进行这些关键比较
  • 在pyspark中将RDD转换为Dataframe

    我正在尝试将 RDD 转换为 pyspark 中的 Dataframe My RDD abc 1 2 0 def 4 6 7 1 我想要 Dataframe 形式的 RDD Index Name Number 0 abc 1 2 1 def
  • 激活虚拟环境不起作用

    我创建了两个 virtualenv 并安装了两个不同版本的 django 现在我在激活两个环境时遇到问题 我喜欢这样 source Django1 6 bin activate 然后我看到环境被激活了 然后我这样做 pip install
  • 使用 pip freeze 安装 numpy

    I need to install Numpy version 1 17 1 but every time it just freezes I have now tried multiple times and I have been wa
  • 如何在IDLE中同时运行两个模块

    我正在开发一个超级简单的套接字程序 我有客户端代码和服务器代码 如何同时运行这两个 py 文件以查看它们是否有效 您可以同时运行 IDLE Python shell 的多个实例 因此 打开 IDLE 并运行服务器代码 然后再次打开 IDLE
  • 命令错误,退出状态 1: python setup.py Egg_info 检查日志以获取完整的命令输出 - 通过 pip 安装 auto-py-to-exe 时

    我正在尝试在与我通常通过 pip 使用不同的 Windows 设备上下载 auto py to exe 但是 当运行时 我收到错误 抱歉 它太长了 ERROR Command errored out with exit status 1 c
  • 在Python中根据等级和花色对一手牌进行排序

    我正打算制作一款纸牌游戏 目前我正在着手开发它 我感到困惑的是 按牌的等级对手中的牌进行排序 然后按花色排序 以及如何减少重复 目前 我可能可以创建一个 for 循环来组织卡片 然后为每种可能性设置 52 个不同的 if 但我想知道它们是否
  • 查找框和裁剪图像的角点

    Hey Guys I am working with numpy and opencv and want to get a image cropped by the contours of it Here is one example wh
  • py.test 日志控制

    我们最近切换到 py test 进行 python 测试 顺便说一句 这非常棒 但是 我试图弄清楚如何控制日志输出 即内置的 python 日志记录模块 我们安装了 pytest capturelog 并且它按预期工作 当我们想查看日志时
  • 如何使用判别函数绘制 3 个类别之间的决策边界

    我有 3 个判别函数 将 2D 空间划分为 3 个区域 我想绘制这些区域之间的决策边界 我不知道如何在 python 中使用 matplotlib meshgrid 来做到这一点 对于2个判别函数 过程很简单 我计算值为 0 的函数和等高线
  • 在Python中使用argparse解析整个JSON

    我正在尝试使用 ARGPARSE 库在一个简单的参数中解析整个 Json 问题是当它遇到儿子内部的不同元素 例如 和 时 它会突然停止 这是测试代码 parse py import argparse parser argparse Argu
  • Python 内存使用情况

    因此 我有一些代码接收一组文件 将其可以缝合在一起 然后绘制它们 我发布了大部分代码 试图使其更具可读性 如果需要 可以添加更多代码 for paths dirs files in os walk start path for d in d

随机推荐