C#XmlReader子节点30GB文件导入SQL Server

C#XmlReader子节点30GB文件导入SQL Server,c#,sql,xmlreader,openstreetmap,get-childitem,C#,Sql,Xmlreader,Openstreetmap,Get Childitem,数据示例: <?xml version='1.0' encoding='UTF-8'?><osm version="0.6" generator="osmconvert 0.7P" timestamp="2013-07-20T19:00:02Z"> . <way id="128725988" version="1" timestamp="2011-09

数据示例:

<?xml version='1.0' encoding='UTF-8'?><osm version="0.6" generator="osmconvert 0.7P" timestamp="2013-07-20T19:00:02Z">
.
   <way id="128725988" version="1" timestamp="2011-09-03T08:06:56Z" changeset="9198624" uid="42429" user="42429">
      <nd ref="1421727256"/>
      <nd ref="1421727264"/>
      <nd ref="1421727238"/>
      <nd ref="1421727237"/>
      <nd ref="1421727256"/>
      <tag k="addr:housenumber" v="43"/>
      <tag k="addr:street" v="Wilhelm-Ahrens-Straße"/>
      <tag k="building" v="yes"/>
   </way>
.
.
   <node id="1964468590" lat="53.068416" lon="8.779039" version="1" timestamp="2012-10-14T12:29:02Z" changeset="13491909" uid="715371" user="cracklinrain"/>
   <node id="1964468593" lat="53.0684177" lon="8.7798644" version="1" timestamp="2012-10-14T12:29:02Z" changeset="13491909" uid="715371" user="cracklinrain">
      <tag k="natural" v="tree"/>
   </node>
.
.
.
   <way id="128725989" version="1" timestamp="2011-09-03T08:06:57Z" changeset="9198624" uid="42429" user="42429">
      <nd ref="1421728028"/>
      <nd ref="1421728023"/>
      <nd ref="1421728016"/>
      <nd ref="1421728024"/>
      <nd ref="1421728028"/>
      <tag k="addr:housenumber" v="44"/>
      <tag k="addr:street" v="Alma-Rogge-Straße"/>
      <tag k="building" v="yes"/>
   </way>
.
.

.
.
.
.
.
.
.
.
这是一个包含30GB数据量的Xml文件示例

我想做的是只获取
元素,这些元素包含特定的通缉犯,如
addr:housenumber

保持连接所需的一件事是来自父元素的
id

我的主要问题是如何处理30GB的文档。如果是几百兆左右,我自己解决也没问题

我已经尝试过的:

  • XmlReader

    可以很好地获取特定属性,但与父id的连接丢失

  • 像xDocument、XmlDocument之类的东西

    问题在于数据量。(30 GB)
    将~1GB加载到内存后,获取一个
    OutOfMemoryException

    我理解将30GB的容量加载到内存中是疯狂的

  • 我已经有了一个单独的工作解决方案,使用一个用于pbf文件的开源库(但我想处理干净的数据),通过迭代每个节点并使用LinqToSql将其添加到数据库中来提取所需的数据

    最终结果:

    我想将每个街道、门牌号、邮政编码和城市导入SQL Server数据库,在该数据库中,
    StreetTable
    CityTable
    相连(我的第一个解决方案运行良好,但在处理了10000个项目后,速度变得非常慢。)


    我希望我想做的事情是可以理解的。

    我不确定,但这些链接可能会有所帮助:

    也有用:OSM过滤器、渗透

    osmconvert和osmfilter的某些选项需要严格排序的输入文件:首先是所有节点,然后是所有方式,然后是所有关系。在reach组中,数据应按id排序


    如果使用.o5m(或.pbf)文件格式,转换和过滤速度会更快。

    我没有使用C的经验,但由于XML文件非常大,只需读取/访问一次就足够了,一个简单的XML
    SAX
    解析器似乎就足够了。C#的
    XmlReader
    似乎类似于SAX解析器。因此,只要读取
    元素并触发相应的事件,就可以存储
    id
    属性。无论何时读取
    事件并触发相应的事件,您都会将其所有属性分配给先前读取的
    id

    Hi Markus,正如我在解释中所述,使用.o5m或.pbf文件不是我想要得到解决方案的方式,因为我已经通过使用.pbf文件获得了一个解决方案,但这个解决方案非常慢。(我认为我用来读取.pbf文件的库是瓶颈)我检查了Osmfilter和Osmission,但它们产生的数据并没有给我的项目带来一些努力。但是谢谢你的建议!