gpt4 book ai didi

c - 如何在 C 中有效地解析大型 bz2 xml 文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:44 27 4
gpt4 key购买 nike

我想做的事情:

  • 定期下载 OSM (OpenStreetMap) 数据(或使用差异更新)
  • 解析该数据,这是一个 bzip2 压缩的 xml,并将与我相关的部分存储在我的数据库中,尽可能提高内存 + cpu 效率(运行时不是什么大问题)

我有什么:

  • xxx.osm.bz2文件(bzip2压缩的xml),压缩后29GB,未压缩约400GB
  • 软件在 debian linux 上运行,没有虚拟机或任何相关的东西

具体问题,详细说明我的问题是什么:

  • 我找到了用于 C++ 的 bzip2 文件流库,但没有找到如何在 C 中处理这个问题(依次解压缩数据并同时使用(在我的例子中是解析)),我应该怎么做?
  • libxml2 和所有其他处理 xml 的可用库我发现解析整个 xml 并让你之后处理它,但我真的不想在内存中有几个 GB 的 xml 只是为了顺序过滤它- 我对 libxml2 的看法是错误的,它实际上具有这样的功能吗?或者我可以使用其他图书馆吗?
  • 也许甚至有一个更高级别的库可以做到这一点,它已经专门用于 OSM 数据?找不到类似的东西,他们提供的工具并没有真正的帮助(我不打算先用 Osmosium 或类似的东西过滤数据,然后用我的代码再次过滤它,我认为那将是非常低效的)

我希望我已经能够清楚地陈述我的问题,如果有人至少能给我指明正确的方向,我将不胜感激。

非常感谢。


更新:发布这篇文章后,我发现 libxml2 实际上从 2.5.0 版开始提供 xmlTextReader,这部分解决了我的问题 - 但只是部分解决了,因为我仍然不知道如何将它与顺序 bz2 文件读取结合起来(当然,我仍然对完全不同的解决方案持开放态度)。


更新 2:解决方案必须从一个永久运行的进程开始工作,并且应该(如第 2 点所述)内存 + cpu 高效,因此除此之外,数据不应被复制数十次(在内存中或在磁盘)。

最佳答案

您不在程序中执行 bzip2 解压缩,只需从标准输入读取未压缩的 xml 并使用 libxml2(或等效项)对其进行解析。然后像这样调用你的程序,享受 unix 管道的美丽:

bzip2 -d < planet.osm.bzip2 | yourtool

关于c - 如何在 C 中有效地解析大型 bz2 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18469714/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com