2012-06-08 2 views
2

Я хотел бы сохранить города мира в списке, поскольку приложение metro не может иметь локальную базу данных, но я не уверен, что это возможно (я нашел текстовый файл с более чем 3 миллионами городов).Хранить огромные данные в приложении метро

Интересно, как они это сделали в приложении погоды. Поскольку в предложенных результатах нет латентности (в режиме поиска или на экране «Любимые места»), я не думаю, что они используют веб-сервис, а также я хочу, чтобы мое приложение могло предлагать список городов даже если соединение отсутствует.

Любая идея?

+0

Используйте Trie. Смотрите, например: - http://stackoverflow.com/questions/6416050/how-to-create-a-trie-in-c-sharp - http://stackoverflow.com/questions/3748200/save-a-trie-to-disk –

ответ

1

Просто вставьте его в текстовый файл, помеченный линией. Это не большой объем данных - вы, вероятно, можете держать все это в ОЗУ за один раз.

Использование базы данных только для этого списка кажется немного переборщиком.

С некоторыми грубыми расчетами, предполагая имена примерно по 20 знаков каждый, я в области около 100 МБ данных города. Это не несущественно для одного списка в памяти - предоставляется, но с ним не так много.

Возможно, вы сможете использовать что-то вроде провайдера Linq to Text.


Как они, возможно, сделали это в очаровании, нужно только беспокоиться о нескольких городах - избранных и о том, как последнее сообщение о вашем местоположении было сообщено последним. Обработка < 10 проще, чем 3 миллиона.

1

3 миллиона городов могут звучать как много. Но для вашего приложения Metro это много?

Это очень грубые оценки

Давайте использовать среднюю длину название города из 20 символов Юникода.

20 * 3 миллиона = 60 миллионов символов юникода.

60 миллионов * 2 байта на символ юникода = 120 миллионов байт.

120000000 байт/1024 = 117,187.5 килобайта

117,187.5 килобайт/1024 = 114 мегабайтов

~ 115mb не совсем 'маленький', но в зависимости от ваших других требований - вы, вероятно, может обрабатывать загрузки 150МБ в Память. Вы можете использовать любые объекты .NET, которые вы обычно используете, например List, и используете LINQ для получения соответствующих городов или чего-то еще.

Это не значит, что это ваш единственный вариант. Это, вероятно, жизнеспособный. Есть много очень умных вещей, которые вы могли бы сделать, чтобы не потянуть все это в память сразу; но если вы хотите устранить/свести к минимуму отставание - это будет вашим лучшим выбором.

+1

Небольшая опечатка - это 114 МБ. –

+0

Даже если это не ваше окончательное решение, это хорошее первое место для начала. Оптимизируйте после выяснения проблемы. Кроме того, я думаю, что ваш набор данных, вероятно, будет намного меньше, чем 114 МБ. [Здесь] (http://www.geodatasource.com/world-cities-database/free) - бесплатный список городов с городами 2.4M, которые без сжатия сжаты 35 МБ. В эти дни это становится довольно маленьким картофелем. В зависимости от кодировки и т. Д. Это может быть намного больше, но тогда вам нужно начать спрашивать себя о своих целях, целевой аудитории и о том, какие компромиссы вы готовы принять. –

+0

@Adam - Вы на 100% правильны. Спасибо. –

1

Я бы предложил изучить SQLite, если вам нужна база данных. Приложения Metro явно не имеют доступа к SQL Server и другим СУБД на базе Win32, но вы можете попробовать SQLite в качестве облегченной альтернативы.

Попробуйте это: https://github.com/doo/SQLite3-WinRT

0

Мы рекомендуем использовать SQLite базу данных с LinqConnect - LINQ DevArt к SQL решение, совместимое с поддержкой SQLite. Вы можете использовать LINQ и ADO.NET интерфейсы с нашим продуктом. Начиная с 4.0, LinqConnect поддерживает приложения Windows Metro: http://blogs.devart.com/dotconnect/linqconnect-for-metro-quick-start-guide.html.

Смежные вопросы