Linq to sql 如何以索引方式高效地存储所有OpenStreetMap数据?

Linq to sql 如何以索引方式高效地存储所有OpenStreetMap数据?,linq-to-sql,sql-server-ce,openstreetmap,sqlbulkcopy,Linq To Sql,Sql Server Ce,Openstreetmap,Sqlbulkcopy,注意:虽然我的目标是Windows Phone 7,但除了尺寸限制之外,它没有引入任何内容 在尝试为WindowsPhone7编写GPS/路由/地图应用程序时,我尝试使用它,并希望将数据存储在我手机上的数据库中。这给了我很多麻烦,所以我不知道什么是正确的方法 以下是我的进展: 我已经下载了,其中包含所有比利时OSM数据 请注意,比利时并没有那么大,它是我居住的国家,所以这似乎是一个好的开始 如果我的数据库接近那个PBF文件的大小就好了,因为它只有80MB 使用Marc Gravell,我现在已经

注意:虽然我的目标是Windows Phone 7,但除了尺寸限制之外,它没有引入任何内容

在尝试为WindowsPhone7编写GPS/路由/地图应用程序时,我尝试使用它,并希望将数据存储在我手机上的数据库中。这给了我很多麻烦,所以我不知道什么是正确的方法

以下是我的进展:

  • 我已经下载了,其中包含所有比利时OSM数据

    请注意,比利时并没有那么大,它是我居住的国家,所以这似乎是一个好的开始

    如果我的数据库接近那个PBF文件的大小就好了,因为它只有80MB

  • 使用Marc Gravell,我现在已经编写了一个解析器,它将为我提供所有OSM数据

  • 在第一次尝试中,我试图将其全部加载到内存中,但这对于我的WindowsPhone7来说似乎太大了,因为它会导致大小>512MB。当时的想法是,我需要一个数据库来存储这些信息,因此将其存储在SQL Server Compact Edition
    sdf
    文件中似乎是合乎逻辑的

  • 因此,我在LINQ to SQL中创建了以下DataContext和表:

    public class RoutingContext : DataContext
    {
        public RoutingContext()
    #if WINDOWS_PHONE
            : base("Data Source = 'isostore:/RoutingDB.sdf'; Max Database Size = 1024; Max Buffer Size = 65536")
    #else
            : base("Data Source = './RoutingDB.sdf'; Max Database Size = 1024; Max Buffer Size = 65536")
    #endif
        {
    
        }
    
        public Table<Node> Nodes;
        public Table<Road> Roads;
        public Table<RoadNode> RoadNodes;
        public Table<NodeProperty> NodeProperties;
        public Table<RoadProperty> RoadProperties;
        public Table<StringData> Strings;
    }
    
    [Table]
    public class Node
    {
        [Column(IsPrimaryKey = true)]
        public int Id { get; set; }
    
        [Column()]
        public int Lon { get; set; }
    
        [Column()]
        public int Lat { get; set; }
    }
    
    [Table]
    public class NodeProperty
    {
        [Column()]
        public int NodeId { get; set; }
    
        [Column(DbType = "NVarChar(255) NOT NULL")]
        public int Key { get; set; }
    
        [Column(DbType = "NVarChar(255) NOT NULL")]
        public int Value { get; set; }
    }
    
    [Table]
    public class RoadProperty
    {
        [Column()]
        public int RoadId { get; set; }
    
        [Column(DbType = "NVarChar(255) NOT NULL")]
        public int Key { get; set; }
    
        [Column(DbType = "NVarChar(255) NOT NULL")]
        public int Value { get; set; }
    }
    
    [Table]
    public class Road
    {
        [Column(IsPrimaryKey = true)]
        public int Id { get; set; }
    }
    
    [Table]
    public class RoadNode
    {
        [Column()]
        public int RoadId { get; set; }
    
        [Column()]
        public int NodeId { get; set; }
    }
    
    [Table]
    public class StringData
    {
        [Column(IsPrimaryKey = true)]
        public int Id { get; set; }
    
        [Column(DbType = "NVarChar(255) NOT NULL")]
        public String String { get; set; }
    }
    
    公共类路由上下文:DataContext
    {
    公共路由上下文()
    #如果WINDOWS\u手机
    :base(“数据源='isostore:/RoutingDB.sdf';最大数据库大小=1024;最大缓冲区大小=65536”)
    #否则
    :base(“数据源=”./RoutingDB.sdf';最大数据库大小=1024;最大缓冲区大小=65536”)
    #恩迪夫
    {
    }
    公共表节点;
    公用道路;
    公共表节点;
    公共表节点属性;
    公众餐桌酒店;
    公共表字符串;
    }
    [附表]
    公共类节点
    {
    [列(IsPrimaryKey=true)]
    公共int Id{get;set;}
    [列()]
    公共int Lon{get;set;}
    [列()]
    公共int Lat{get;set;}
    }
    [附表]
    公共类节点属性
    {
    [列()]
    公共int节点ID{get;set;}
    [列(DbType=“NVarChar(255)非空”)]
    公共int密钥{get;set;}
    [列(DbType=“NVarChar(255)非空”)]
    公共int值{get;set;}
    }
    [附表]
    公共级道路财产
    {
    [列()]
    public int RoadId{get;set;}
    [列(DbType=“NVarChar(255)非空”)]
    公共int密钥{get;set;}
    [列(DbType=“NVarChar(255)非空”)]
    公共int值{get;set;}
    }
    [附表]
    公共道路
    {
    [列(IsPrimaryKey=true)]
    公共int Id{get;set;}
    }
    [附表]
    公共类道路节点
    {
    [列()]
    public int RoadId{get;set;}
    [列()]
    公共int节点ID{get;set;}
    }
    [附表]
    公共类字符串数据
    {
    [列(IsPrimaryKey=true)]
    公共int Id{get;set;}
    [列(DbType=“NVarChar(255)非空”)]
    公共字符串{get;set;}
    }
    
  • 首先,我时不时地使用
    SubmitChanges()
    进行
    insertonsumbmitour()
    插入,但这显然是一种放慢速度的方法,因为
    SubmitChanges()
    每行插入一行。然后我尝试了
    SqlBulkCopy
    ,它显然不适用于SQLServer Compact Edition,这让我最终发现它似乎更快,但仍然很慢

  • 我在使用此解决方案时遇到两个问题:

  • 速度仍然很慢。

  • 生成的大小是原来的许多倍。请注意
    比利时.osm.pbf
    只有~80MB。然而,
    .sdf
    似乎约为592MB,对此我能做些什么吗

  • 因此,以下是我的问题:

  • 我到底哪里出了问题?我应该怎么做?

    我觉得很奇怪,要正确处理80MB的文件太难了。还请注意,我现在正在我的电脑上进行所有这些计算,一旦它在电脑上正常运行,我将在WindowsPhone7上试用

  • 如果真的没有便捷的LINQ解决方案,那么生成索引PBF有意义吗?

    然而,这需要我重新发明数据库可以提供给我的东西

  • 增加我电脑的大小,实质上是编写一个转换器,然后将~592 MB
    .sdf
    数据库文件发送到我的手机,这样做有意义吗?

    这似乎是介于选项1和选项2之间的最后一种选择,但这并不能使应用程序能够上传到市场,因为必须事先在计算机上转换,然后以某种方式将其上传到手机上,这是非常令人讨厌的


  • 请注意,我关注的是问题1,其他问题仅仅是解决方案,如果这被证明是不可能的,我只是错过了一些可以让这变得流畅的东西,但我不知道…

    使用数据库来解决这一问题是有意义的。这个大小可能是由于pbf文件的紧凑性造成的,还请记住SQL CE中的所有数据都是unicode。你的问题不清楚-什么是慢?此外,您可以尝试在导入后压缩数据库文件,这可能会使文件缩小一点。根据生成的大小,您的.xap对于市场来说可能仍然足够小。(由于.xap也压缩了sdf文件)

    WriteToServer速度很慢,但我想我只能尝试剥离数据,只在数据库中存储我真正需要的数据,这将进一步优化磁盘占用空间。关于这个答案,我的问题是:我可以将其更改为非unicode吗?紧凑不是只对插入有零影响吗?我认为市场不接受这么大的文件…我写了SqlCeBulkCopy,它让我担心WriteToServer太慢,你能分享一些代码吗?最大XAP大小为225 MB!你在说什么契约?是SqlCeEngine的还是你自己写的?因为SqlCeEngine在运行其他t时似乎什么也没做