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

时间:2013-08-27 15:28:08

标签: c memory xml-parsing bzip2

我想做什么:

  • 定期下载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效率,所以除了其他任何东西之外,数据不应该被复制数十次(在内存中或在磁盘)。

1 个答案:

答案 0 :(得分:2)

你没有在程序中进行bzip2解压缩,只需从stdin读取未压缩的xml并用libxml2(或等价)解析它。然后就这样打电话给你的程序,享受unix管道的优点:

bzip2 -d < planet.osm.bzip2 | yourtool