1

我想做的事:

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

我有的:

  • xxx.osm.bz2文件(bzip2压缩xml),压缩29GB,未压缩约400GB
  • 软件在 debian linux 上运行,没有 vm 或任何涉及的东西

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

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

我希望我能够清楚地说明我的问题,如果有人至少可以为我指出正确的方向,我将非常感激。

非常感谢。


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


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

4

1 回答 1

3

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

bzip2 -d < planet.osm.bzip2 | yourtool
于 2013-08-27T17:00:48.413 回答