2013-08-27 20 views
0

我想要做什麼:如何有效地分析大BZ2 xml文件用C

  • 下載OSM(OpenStreetMap的)的定期數據(或者用它的diff更新)
  • 解析數據,這是一個bzip2壓縮XML和我有關的部分,存儲在我的數據庫內存+ CPU儘可能高效(運行時不thaaaat大問題)

我有什麼:

  • xxx.osm.bz2文件(bzip2壓縮XML),壓縮29GB,未壓縮約400GB
  • 軟件在Debian Linux上運行,沒有虛擬機或任何涉及

的具體問題,闡述了什麼我的問題是:

  • 我發現對C的bzip2文件流庫++,但不知道如何在C(sequentielly數據進行解壓縮,並使用在同一時間在我的情況(解析)的話),對付這個我應該如何去做這個?
  • libxml2和處理xml的所有其他c可用庫我已經發現解析整個xml並讓你在事後處理它,但是我並不想在內存中有幾GB的xml,只是爲了順序過濾它 - 我錯了libxml2,它實際上有這樣的功能?還是有一個我可以使用的不同的庫?
  • 也許還有一個更高級的庫來做到這一點,這已經專門用於OSM數據?找不到這樣的東西,他們提供的工具並沒有真正的幫助(我不打算先用Osmosium或類似的東西過濾數據,然後用我的代碼再次過濾它,這將是非常低效的,我認爲)

我希望我能夠清楚地說出我的問題,如果有人能夠至少指出我正確的方向,我會非常感激。

非常感謝。


更新:發佈此右後我發現,實際上的libxml2提供了從2.5.0版本的XmlTextReader起,這部分解決了我的問題 - 但只是部分,因爲我仍然不知道如何結合起來,與順序bz2文件閱讀(當然,我仍然可以開放給完全不同的解決方案)。


更新2:該解決方案必須從長期運行過程中的工作,而應該是內存+ CPU效率(在第2點規定),因此,除了別的有數據不應該被複制數十次(在內存或磁盤上)。

回答

2

你不會在你的程序中做bzip2解壓縮,只需從stdin中讀取未壓縮的xml並用libxml2(或equvalent)解析它。然後就這樣打電話給你的程序,並享受unix管道的責任:

bzip2 -d < planet.osm.bzip2 | yourtool 
+0

這實際上看起來更復雜,因爲我有一個永久運行的過程;當然,我可以啓動一個shell並執行或編程管道,但是這又複雜又低效,因爲afaik在linux中沒有零拷貝管道 - 管道通常是緩衝的 - 這意味着在整個地方多次複製。但是,是的,它可以工作,我會更新我的問題。所以thx在此期間。 – griffin

+0

在做了一些更多的研究並思考了這一點之後,我所說的零拷貝實際上是不可能的,因爲解壓縮的數據必須存儲在任何地方,所以你提出的解決方案畢竟不是那麼糟糕(或者概念文獻)。 (+1),和一個thx;) – griffin