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

标签 c++ string memory storage

注意:这是对 this question 的跟进.

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

我正在努力重构这些困惑的代码,并尝试想出一个好的方法来进行所有这些匹配。

这段代码的性能要求比较严格。进行这些匹配时不需要等待 I/O,因此它们需要在内存中。此外,此进程可能有 100 多个拷贝同时运行,因此启动时的大 I/O 可能会导致其他拷贝的 I/O 变慢。

考虑到这些要求,如果只将这些字符串的一个拷贝存储在 RAM 中将是最有效的(请参阅上面链接的我之前的问题)。

这个程序目前运行在带有微软编译器的 Windows 上,但我希望尽可能保持解决方案的跨平台性,所以我不认为我想使用 PE 资源文件或其他东西。

Mmapping 一个外部文件可能有效,但我遇到了保持程序版本和数据版本同步的问题,一个没有另一个通常不会改变。此外,这需要一些文件“格式”,这会增加一层我不想拥有的复杂性。

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

最佳答案

我不确定当前的实现有多慢。因此,如果不知道需要什么级别的优化,就很难推荐优化。

不过,鉴于此,我可能会建议采用两阶段方法。把你的字符串列表编译成一个 radix tree ,然后将此树保存为某种自定义格式(XML 可能足以满足您的目的)。

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

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

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

关于c++ - C++中分类字符串文字的高效内存存储和检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3738940/

相关文章:

r - 有没有一种方法可以在 R 中创建比标准矩阵使用更少内存的矩阵?

c++ - 如何在 STL 容器中查找特定对象

c++ - 我可以将 Visual Studio 配置为在 C++ 项目中使用真实文件夹而不是筛选器吗?

java - 字符串连接期间创建的对象数

linux - 如何在搜索特定字符串后使用 grep 和 sed 替换子字符串?

c# - 如何在 C# 中不使用 indexof 方法从字符串中查找子字符串?

c++ - N 个 child 向 parent 发送消息

c++ - 二维数组如何在输入中允许空白?

C++ - 添加列表 <Task> l(或任何 STL 容器)作为数据成员导致错误,当删除分配在堆上的任务数组时

windows - Hyper-V WMI 类的哪些属性可访问内存信息