首页 > 解决方案 > 在具有链接结构的文本文件中,我如何在 C++ 中快速跟踪这些链接,而无需多次运行该文件?

问题描述

我即将开始一个项目,该项目需要我将 IFC 文件中的特定信息加载到类或结构中。我正在使用 C++,但自从我上次使用它已经有好几年了,所以我有点生疏了。

IFC 文件具有链接结构,其中一行中的元素可能引用另一行,而另一行又链接到另一行。我提供了一个简短的示例,其中初始的“#xxx”是行索引,而该行中的任何其他“#xxx”都是指向不同行的链接。

#170=IFCAXIS2PLACEMENT3D(#168,$,$);
#171=IFCLOCALPLACEMENT(#32,#170);
#172=IFCBUILDINGSTOREY("GlobalId", #41, "Name", "Description", "ObjectType", #171"...);

在这个例子中,我需要搜索“IFCBULDINGSTOREY”,然后沿着链接向后浏览文件,跳转存储我需要的重要信息位。

主要问题是我的测试文件有 273480 行 (18MB),并且链接可以从文件的一端跳转到另一端 - 我可能必须处理比这更大的文件。

在这个文件中,我需要填充大约 500 个对象,因此需要在文件中跳转很多以获取相关信息。

在这样的文件中跳转的性能友好的方法是什么?

标签: c++searchifc

解决方案


(披露 - 我帮助实现 .NET IFC

我会质疑你在做什么,这意味着你不能使用 IFC 模式的许多 现有实现之一。解析 IFC 模型通常是问题的简单部分。如果您想可视化几何图形或从几何图元进行测量,则存在另一层复杂性......例如,只有几十种特定几何类型:https ://standards.buildingsmart.org/IFC/DEV/IFC4_3/ RC2/HTML/链接/ifcadvancedbrep.htm

如果您访问BuildingSmart 的软件实现列表并搜索“开发”,您将获得针对各种技术/语言的良好列表。

如果您确定要自己实现,典型的方法是构建某种字典/地图,根据实体的键来保存实体。天真地,您可以使用 Lexer 运行初始传递,并在内存中构建地图。但由于 IFC 模型可能超过 GB,您可能需要一种更复杂的方法来构建某种持久索引 - 甚至可能将其放入某种带有索引的数据库中(可能是某种文档数据库)。如果您想支持通过多个会话对数据进行“随机访问”,这一点将变得更加重要。


推荐阅读