正则表达式搜索非常大的文件

2023-11-27

我需要使用正则表达式扫描 300MB 的文本文件。

  • 读取整个文件并将其放入变量中会占用超过 700MB 的 RAM,然后会失败并出现“无法分配内存”错误。
  • 匹配可以是两行或三行,所以我不能在循环中使用行到行步进。

是否有任何惰性方法可以使用正则表达式进行完整文件扫描,而不将其读入单独的变量中?

UPD

完毕。现在你可以使用这个函数来按块读取。 根据您的目标修改它。

def prepare_session_hash(fname, regex_string, start=0)
  @session_login_hash = {}
  File.open(fname, 'rb') { |f|
    fsize = f.size
    bsize = fsize / 8
    if start > 0
      f.seek(start)
    end

    overlap = 200

    while true
      if (f.tell() >= overlap) and (f.tell() < fsize)
        f.seek(f.tell() - overlap)
      end
      buffer = f.read(bsize)
      if buffer
        buffer.scan(s) { |match|
          @session_login_hash[match[0]] = match[1]
        }
      else
        return @session_login_hash
      end
    end
  }
end

  1. 以块的形式遍历文件,而不是逐行遍历文件,其中块是由频繁出现的字符或模式(例如“X”)的出现创建的。
  2. “X”是这样的,它永远不会存在于你的正则表达式中,即“X”是你的正则表达式永远不会匹配字符串的地方。
  3. 匹配当前块中的正则表达式,提取匹配项并继续到下一个块。

Example:

This is string with multline numbers -2000
2223434
34356666
444564646
. These numbers can occur at 34345
567567 places, and on 67
87878 pages . The problem is to find a good
way to extract these more than 100
0 regexes without memory hogging.

在本文中,假设所需的模式是数字字符串,例如/d+/s匹配多行数字, 然后,您可以选择块创建模式,而不是处理和加载整个文件,在本例中为“句号”.并且只读取和处理直到这个模式,然后移动到下一个块。

CHUNK#1:

This is string with multline numbers -2000
2223434
34356666
444564646
.

CHUNK#2:

These numbers can occur at 34345
567567 places, and on 67
87878 pages

等等。

编辑: 还从评论中添加@Ranty的建议:

或者只是读一些行,比如 20 行。当你找到 匹配其中,清除直到匹配结束并追加另外 20 行。 无需计算频繁出现的“X”。

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

正则表达式搜索非常大的文件 的相关文章

随机推荐

  • 上下文之间的事务

    我正在使用 Entity Framework Core 7 开发一个控制台应用程序 该应用程序分为 3 个不同的区域 但数据库是共享的 我创建了3个不同的DbContext现在我需要在它们之间执行交易 所以我需要一个原子操作来保存所有更改或
  • Woocommerce:更新所有产品的功能

    我的 Woocommerce 产品有问题 如果我只是更新产品 编辑产品并单击 更新 按钮 而不进行任何更改 则此问题已得到解决 我的网站中有大约 2000 个产品 然后我考虑使用 function php 文件中的函数来执行此操作 应该是这
  • 在 python 中将图像(png 和 jpg)转换为多维列表并向后转换

    我使用 PIL 将图像转换为单色 然后转换为列表列表 但我不确定如何处理 RGB 图像 有人可以指导我如何将图像转换为多维列表并向后转换 python 吗 让我们从已知的示例图像开始 这是一个实际使用的小型 3x2 尺寸和一个较大的尺寸 以
  • Azure 资源模板依赖项/Application Insights

    我在将带有 Web 应用程序的 Application Insights 部署到 Azure 时遇到先有鸡还是先有蛋的问题 在 ARM 模板中 Application Insights 模块依赖于应用程序 ID 的网站 请参阅下面的 ARM
  • 不支持带有第二个索引的 ORDER BY

    我正在使用 cassandra 2 1 和最新的 CQL 这是我的表和索引 CREATE TABLE mydata chats new id bigint adid bigint fromdemail text fromemail text
  • 寻找Java拼写检查库[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个开源 Jav
  • 将 Julia 数组转换为数据帧

    我有一个数组 X 我想将其转换为数据帧 根据网络的推荐 我尝试转换为数据帧并收到以下错误 julia gt y convert DataFrame x ERROR converthas no method matching convert
  • 使用gson反序列化json字符串

    我的 java servlet 以这种方式返回 json 字符串 Gson gson new Gson String lista gson toJson utenti System out println lista request set
  • Android Asynctask处理实时视频帧

    我正在使用 OpenCV 尝试进行一些实时视频处理 由于处理相当繁重 它会显着延迟输出帧 使实时流看起来不稳定 我想将一些处理卸载到 AsyncTask 中 我已经尝试过 它实际上使视频更加流畅 然而 它最终会立即启动大量任务 然后它们会慢
  • Asp.Net Core 中使用 POST 方法重定向到 URL

    我有简单的网址重写器 private static void RedirectToAPI RewriteContext context var request context HttpContext Request if request P
  • 从 MKMapView 找出您所在的区域类型

    有什么方法可以从 MKMapView 确定您所在的区域类型吗 IE 如果地图的中心位于海洋中 我们可以告诉用户 地图的中心位于海洋上方 或者如果地图的中心位于绿色区域上方 地图的中心位于公园上方 我能想到的唯一方法是创建可见屏幕的屏幕截图并
  • 如何使 Typescript 与 SystemJS 和 Angular 一起使用成为可能?

    我试图让 SystemJS 与 Typescript 一起工作 但它们似乎相互冲突 如何利用 System js 的自动加载而不与 Typescript 上的关键字冲突 使用 import require 使得 Typescript 使用它
  • 无法在 IronPython 中使用日期时间

    我将 IronPython 托管在 C Web 应用程序中 如下所示 var engine Python CreateEngine var scope engine CreateScope var script Engine CreateS
  • Composer:如何在 Symfony 2.3 中安装 `dev` 包?

    正在尝试安装KnpGaufrette捆绑包在 Symfony 2 3 项目中 我没有运气 问题是 minimum stability stable in composer json 我需要的包是dev master版本依旧 Reading
  • C# 编译器中的 Duck 类型

    Note这是not关于如何在 C 中实现或模拟鸭子类型的问题 多年来 我一直认为某些 C 语言功能依赖于语言本身定义的数据结构 对我来说 这总是像一个奇怪的先有鸡还是先有蛋的情况 例如 我的印象是foreach循环只能与实现的类型一起使用I
  • UIStackView:从 xib 加载视图并更新子视图的高度约束没有反映任何更改?

    我的应用程序中有以下层次结构 UIScrollView UIStackView UIView 1 load with xib and added in arrangedSubviews UIScrollView 1 1 horizontal
  • 获取 Tkinter Text 小部件中的总行数?

    我有一个 TkinterText小部件 我想知道它包含多少行 我知道的text cget height 方法 但是这只告诉我显示了多少行 我想知道总共有多少行 我正在使用此信息来尝试制作自己的自定义滚动条 因此我们将不胜感激 Use the
  • cx_Oracle.DatabaseError: ORA-12514: TNS:listener 当前不知道连接描述符中请求的服务

    我正在尝试对新安装的系统进行健全性测试Oracle client 12 2 in RHEL 7 linux来自Python程序 但它因上述错误而失败 不确定我在那里缺少什么 请帮忙解决这个案例 cx Oracle DatabaseError
  • Double.parseDouble 和 Integer.parseInt 之间的行为差​​异[重复]

    这个问题在这里已经有答案了 似乎 parseDouble 可以接受带有尾随空格的字符串 但 parseInt 和 parseLong 会抛出异常 例如对于这个测试用例 Test public void testNumberParsing t
  • 正则表达式搜索非常大的文件

    我需要使用正则表达式扫描 300MB 的文本文件 读取整个文件并将其放入变量中会占用超过 700MB 的 RAM 然后会失败并出现 无法分配内存 错误 匹配可以是两行或三行 所以我不能在循环中使用行到行步进 是否有任何惰性方法可以使用正则表