C++ 中分类字符串文字的高效内存存储和检索

2023-12-28

注:这是后续这个问题 https://stackoverflow.com/questions/3738092/c-string-literal-storage-between-multiple-copies-of-process-or-library.

我有一个“遗留”程序,它可以对大块 HTML 进行数百个字符串匹配。例如,如果 HTML 匹配 20 多个字符串中的 1 个,则执行某些操作。如果它与其他 4 个字符串中的 1 个匹配,则执行其他操作。有 50-100 组这些字符串与这些 HTML 块(通常是整个页面)进行匹配。

我正在努力重构这些混乱的代码,并试图想出一个好的方法来完成所有这些匹配。

这段代码的性能要求相当严格。在进行这些匹配时,它不需要等待 I/O,因此它们需要位于内存中。此外,该进程可能有 100 多个副本同时运行,因此启动时的大量 I/O 可能会导致其他副本的 I/O 缓慢。

考虑到这些要求,如果这些字符串的一个副本仅存储在 RAM 中,那么效率将是最高的(请参阅上面链接的我的上一个问题)。

该程序目前在带有 Microsoft 编译器的 Windows 上运行,但我希望解决方案尽可能跨平台,因此我认为我不想使用 PE 资源文件或其他东西。

映射外部文件可能会起作用,但我会遇到保持程序版本和数据版本同步的问题,一个版本通常不会在没有另一个版本的情况下发生更改。此外,这还需要一些文件“格式”,这增加了我不想拥有的复杂性。

因此,在完成所有这些前言之后,似乎最好的解决方案是拥有一堆字符串数组,然后我可以对其进行迭代。这看起来有点混乱,因为我大量混合了代码和数据,但是根据上述要求,有没有更好的方法来处理这种情况?


我不确定当前的实施有多慢。因此,在不知道需要什么级别的优化的情况下,很难推荐优化。

然而,鉴于此,我可能建议采用两阶段方法。获取你的字符串列表并将其编译成基数树 http://en.wikipedia.org/wiki/Radix_tree,然后将此树保存为某种自定义格式(XML 可能足以满足您的目的)。

然后你的进程启动应该包括读取基数树和匹配。如果您想要/需要优化树的内存存储,可以作为一个单独的项目来完成,但在我看来,改进匹配算法将更有效地利用时间。在某些方面,这是一个“推出你自己的正则表达式系统”的想法。与使用解析器生成器的建议非常相似。

编辑:我使用了与此类似的东西,作为预编译步骤,自定义脚本生成某种程度优化的结构并将其保存到大型 char* 数组中。 (显然它不能太大,但这是另一种选择)

这个想法是将列表保留在那里(使维护相当容易),但预编译步骤可以加快运行时的访问速度。

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

C++ 中分类字符串文字的高效内存存储和检索 的相关文章

  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 替换打字稿中字符串中字符的所有实例?

    我正在尝试用 x 字符替换电子邮件中的所有句号 例如 电子邮件受保护 cdn cgi l email protection 将变为 myxemail emailxcom 电子邮件设置为字符串 我的问题是它不只是替换句号 而是替换每个字符 所
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐