Примечание. Пока я нацелен на Windows Phone 7, он не вводит ничего, кроме ограничения размера.
В попытке написать приложение GPS / Routing / Map для Windows Phone 7, я пытаюсь использовать OpenStreetMap для этого, и я хочу, чтобы мои данные хранились в базе данных SQL Server Compact Edition на моем Windows Phone 7 . Это дает мне много неприятностей, поэтому я не понимаю, что это за правильный путь ...
Вот мой прогресс:
Я загрузил Belgium.osm.pbf
, который содержит все данные OSM в Бельгии в формате PBF .
Обратите внимание, что Бельгия не такая большая, это страна, в которой я живу, поэтому это кажется хорошим началом.
Было бы неплохо, если бы моя база данных была близка к размеру этого файла PBF, потому что это всего лишь 80 МБ ...
Используя protobuf-net Marc Gravell, я написал парсер, который дает мне все данные OSM.
С первой попытки я попытался просто загрузить все это в память, но это кажется слишком большим для моего Windows Phone 7, так как это приводит к размеру> 512 МБ. Тогда идея заключалась в том, что мне нужна база данных для хранения этой информации, поэтому логично хранить ее в sdf
файле SQL Server Compact Edition.
Следовательно, я создал следующие DataContext и таблицы в LINQ to SQL:
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; }
}
Сначала я продолжал InsertOnSubmitTour()
с помощью SubmitChanges()
время от времени, но это, по-видимому, способ замедлить, поскольку SubmitChanges()
вставляет строку за строку. Итак, я пошел попробовать SqlBulkCopy
который, по-видимому, не работает для SQL Server Compact Edition, это заставило меня в конечном итоге с SqlCeBulkCopy, который, кажется, быстрее, но все еще медленный.
Есть две проблемы, с которыми я сталкиваюсь с этим решением:
Это все еще довольно медленно.
Полученный размер во много раз больше. Обратите внимание, что Belgium.osm.pbf
составляет только ~ 80 МБ. Однако .sdf
составляет ~ 592 МБ, есть ли что-нибудь, что я могу сделать по этому поводу?
Итак, вот мои вопросы:
Где я полностью ошибся? Что мне делать вместо этого?
Мне кажется странным, что обработать 80-мегабайтный файл так сложно. Также обратите внимание, что я делаю все эти вычисления на своем компьютере в настоящий момент, и как только он будет работать на компьютере, я попробую его на Windows Phone 7.
Если на самом деле нет удобного решения LINQ, было бы ли смысл создавать индексированную PBF?
Однако это требует от меня переосмыслить то, что база данных может мне уже предоставить.
Было бы целесообразно увеличить размер моего компьютера, по сути, сделать запись конвертера, а затем отправить файл базы данных ~ 592 МБ .sdf
на мой телефон?
Это, по-видимому, последнее средство, которое находится между вариантами 1 и 2, но это не делает приложение загружаемым в MarketPlace, так как довольно неприятно переводить на компьютер заранее, а затем каким-то образом получить его на телефоне.
Обратите внимание, что я сосредотачиваюсь на вопросе 1 и что другие вопросы - это просто решения, если это показано, что это невозможно, я просто пропустил что-то, что сделало бы это свободно, но я понятия не имею ...
Для этого имеет смысл использовать базу данных. Размер может быть обусловлен компактностью файла pbf, также помните, что все данные в SQL CE являются unicode. Ваш вопрос непонятен - что медленно? Кроме того, вы можете попытаться скомпилировать файл базы данных после импорта, он может немного уменьшить размер файла. В зависимости от результирующего размера ваш .xap все еще может быть достаточно мал для MarketPlace. (Так как .xap также застегивает файл sdf)