Чи є спосіб використання магазину Key-Value для геопросторових даних?


26

У минулому я використовував багато реляційних баз даних, але також читав про всі бази даних NoSQL, і сховища Key-Value виглядають неприємно.

Коли я зберігаю геометричний об'єкт, я здебільшого використовую п'ять індексованих ідентифікаційних стовпців, MIN_X, MAX_X, MIN_Y та MAX_Y (де X та Y - у проекції карти). Інші дані мені не потрібні.

Мені потрібні значення X і Y для пошуку об'єктів у визначеному місці (прямокутник карти), і мені потрібно значення ідентифікатора, якщо я хочу оновити вказаний об'єкт.

Чи можна використовувати для цього магазин Key-Value?

Відповіді:


18

Ми використовуємо Google AppEngine для запуску просторових запитів / атрибутів, і головна проблема (з першого дня) - як індексувати великі набори ліній / полігонів довільного розміру. Дані точок не надто складні (див. Геохаш, геомодель тощо), але набори випадково кластеризованих малих / великих багатокутників завжди були проблемою (а в деяких випадках все ще є)

Я спробував кілька різних версій просторової індексації на GAE, але більшість це лише два варіанти нижче. Жодна не була такою швидкою, як бази даних SQL, і всі мають плюси та мінуси. Хоча компроміси здаються розумними для більшості програм для картографування на базі Інтернету. Крім того, два нижче необхідно поєднати з відсікою геометрії пам'яті (через JTS тощо), щоб видалити будь-які функції, які не відповідають кінцевим параметрам пошуку. і нарешті, вони покладаються на особливості GAE, але я впевнений, що це можна застосувати до інших архітектур (або використовувати TyphoonAE для запуску на кластер Linux, ec2 тощо)

Сітки - упакуйте всі функції для певної області у відомий індекс сітки. Помістіть невеликий просторовий індекс у сітку, щоб ви швидко пересувались набором функцій, які він містить. Для більшості запитів вам потрібно буде лише отримати кілька сіток, які швидко, оскільки ви знаєте точну умову іменування сітки та як вона пов'язана з об'єктами K / V (отримує, а не запити)

Плюси - досить швидкий, простий у реалізації, без сліду пам’яті.

Мінуси - потрібна попередня обробка, користувачеві потрібно визначити розмір сітки, великі геоматеріали поділяються на декілька сіток, кластеризація може спричинити перевантаження мереж, проблеми з серіалізацією / десеріалізацією можуть бути проблемою (навіть коли стискаються через буфери протоколів)

QuadKeys - це поточна реалізація. в основному це те саме, що і Grids, за винятком того, що немає встановленого рівня сітки. як додаються функції, вони індексуються сіткою квадрокілька, яка повністю містить їх межі (або, в деяких випадках, розділяється на дві частини, коли не може бути використаний один квадратік, подумайте, що дателі). Після того, як qk буде знайдений, його розділяють на максимальну кількість менших qk, які забезпечують більш точне зображення зерна функції. вказівник / bbox на цю функцію потім упаковується у легкий gridindex (група функцій), який можна запитувати (оригінальний дизайн запитував функції безпосередньо, але це виявилося занадто повільно / CPU інтенсивно у випадках, коли набір результатів був великий)

Полілінійні квадратики http://www.arc2earth.com/images/help/GAE_QKS_1.png Багатокутні багатокутники http://www.arc2earth.com/images/help/GAE_QKS_2.png

Конвенція про іменування чотиримісних кнопок, що використовується вище, добре відома, і що ще важливіше, має тенденцію до збереження місцевості (детальніше описано тут )

Полігон нагорі виглядає приблизно так: 0320101013123 03201010131212 03201010131213 0320101013132 0320101013133 03201010131302 03201010131303 032010101313002 032010101313003 032010101313012 032010101313013 03201010131312 03201010131312 03201010131312 032010101313

якщо межі запитів досить малі, ви можете безпосередньо отримати через qk. це оптимально, оскільки його єдиний, пакетний виклик RPC до даних GAE. якщо межі досить великі, що вона включала занадто багато можливих qks (> 1000), ви можете альтернативно запитувати за допомогою фільтра (наприклад: qk> = 0320101013 та qk <= 0320101013 + \ ufffd). Конвенція про іменування чотиримісних ключів плюс те, як рядки GAE індексує, дозволяє вищезазначеному запиту отримувати лише існуючі сітки, що опускаються нижче цього значення qk.

Є й інші застереження та проблеми, пов'язані з парфумерією, але в цілому його здатність проводити запити на квадратиках, що робить це здійсненним

приклади - запит на округи США: geojson

Плюси - досить швидко, без конфігурації розміру сітки, відсутності сліду пам’яті, немає переповнених сіток

Мінуси - необхідна попередня обробка, можливий перезавантаження в деяких сценаріях, відсутність полярних даних

Криві заповнення місця - Подивіться на розмови NextGen-запитів Альфреда в Google I / O цього року. Включення загальних кривих заповнення простору / часу разом з новими операторами MultiQuery (працює паралельно) дозволить отримати справді круті просторові запити. Чи обіграє це традиційна продуктивність SQL? Важко сказати, але він повинен дійсно добре масштабуватися. І ми швидко наближаємось до майбутнього, коли мобільні пристрої, що постійно перебувають на будь-якій формі / розмірі, різко збільшуватимуть трафік на ваш сайт / послугу.

Нарешті, я також погоджуюся, що вам слід дуже уважно ознайомитися зі своєю проблемою, перш ніж вибирати NoSQL через SQL. У нашому випадку мені дуже сподобалась модель ціноутворення GAE, тому вибору насправді не було, але якщо вам не потрібно масштабувати, заощадите собі час і просто використовуйте стандартний sql db


Ви згадуєте GAE, але яку базу даних ви використовуєте? Є кілька: cloud.google.com/products/storage
Дон

11

Я чув про GeoCouch, який є реалізацією CouchDB для даних на основі локації. І я також думаю, що MongoDB має геопросторові можливості індексації.


Так, вони обидва, і SimpleGeo будує просторове розширення до Кассандри. Я нічого не чув у Волдеморті чи MemCache
TheSteve0

О, я люблю те, що робить SimpleGeo. Я ревнивий і хотів би працювати на них!
JoshFinnie

8

В основному це питання щодо алгоритмів. Переповнення стека також може бути хорошим місцем для запитання.

У будь-якому випадку, відповідь на ваше пряме запитання - "так, ви можете використовувати магазин kvp для представлення просторових даних". Краще питання, однак, можливо, "ПОТРІБНО використовувати я kvp-магазин для представлення просторових даних?"

Відповідь на це питання (як і багато інших) - "це залежить". Це залежить від масштабу, вашої (транзакційної) робочої навантаження, характеру даних та обчислювальної інфраструктури, яка є у вас в розпорядженні.

Магазин kvp матиме низькі накладні витрати, що може допомогти збільшити пропускну здатність для великих обсягів вставки та оновити паралелізм. Однак це не буде дуже швидким просторовим пошуком (знайдіть усі об'єкти в прямокутнику). Для цього ви хочете просторовий індекс, як R-дерево.

Однак якщо у вас дійсно великий об'єм даних та величезна група комп'ютерів, то використання індексу kvp може забезпечити певні переваги. Єдиний спосіб справді точно знати - це зробити вимірювання перф, використовуючи фактичні дані та патени доступу, з якими ви очікуєте зустрітись.

Оновлення :

Ось трохи більше інформації. Для просторового пошуку ви можете використовувати магазин KVP. Проблема в тому, що це повільно. Щоб зрозуміти чому, розгляньте щось подібне:

  ***********
  ***********
  ***********
  ***********
  ****###****
  ****###****
  ****###****
  ***********
  ***********
  ***********
  ***********

Де * і # позначають об'єкти, розміщені в сітці 11х11, з початком у верхньому лівому куті. Уявіть собі пошук об’єктів у прямокутнику (4,4) - (7,7). Це має знайти всі "#". Якщо припустити, що ви використовуєте b +-дерево для представлення своїх індексів у магазині KVP, ви можете знайти результати, використовуючи або індекс "X", або індекс "Y". У цьому випадку не має значення, який. Для обговорення я буду використовувати індекс x. Ви б зробили пошук журналу (n) в індексі X, щоб знайти перший вузол зі значенням X "4", а потім перебирати через вузли листя b + -три дерева, поки ви не знайдете вузол зі значенням більше 7. Як ви Ітерація через індекс x ви б відхилили все, що було поза бажаним діапазоном у.

Це повільно. Уявіть це на великій сітці з однаковою щільністю, скажімо, 100 K * 100 K. Там вам у кінцевому підсумку доведеться сканувати записи "300 000" індексу, щоб знайти лише 9 записів. Якщо ви використовуєте правильно збалансоване дерево R-дерева, то для пошуку індексу, ймовірно, потрібно буде сканувати близько 90 записів або близько того. Це величезна різниця.

Проблема, однак, полягає в тому, що утримувати баланс R-дерева досить дорого. Ось чому відповідь "це залежить", і чому питання "чи потрібно це робити" набагато важливіше, ніж "як це зробити".

Якщо ви вставляєте та видаляєте записи багато, і в основному робите пошук "ідентифікатора об'єкта" і не часто здійснюєте "просторовий" пошук, то використання вашого індексу KVP дасть вам кращу продуктивність для того, що ви насправді хочете використовувати систему для . Однак якщо ви вставляєте або видаляєте нечасто, але просторово шукаєте багато, тоді ви хочете використовувати R-дерево.


Я б не прийняв відповідь на кшталт "так, ти можеш". тому що я хочу знати, ЯК . І "ДОЛЖЕН Я .." - це не краще питання, тому що, як ви сказали, "це залежить".
Йонас

1
Я повинен не погодитися з вами. Якщо ви хочете побудувати корисну систему або залишити після себе корисну посилання в Інтернеті для інших людей, що будують подібні системи, то "чи повинен я" набагато важливіше, ніж "як". В інтересах бути корисною, проте я змінив свою відповідь для вас, щоб надати трохи інформації про те, як.
Скотт Віснєвський

@Jonas Я вважаю, що отримані вами "поради" були через те, що ви задали питання: "але я також читав про всі бази даних NoSQL, і магазини Key-Value виглядають цікавими". Це має всі ознаки рішення проблеми, яка шукає проблему.
JasonBirch

NoSQL вирішує проблему, але це проблема, яку практично ніхто не має, тому що вони не працюють в досить масових масштабах. На жаль, завжди приємно думати, що наші власні системи є більшими в грандіозній схемі речей, ніж вони є насправді. :)
JamesRyan

4

Якщо ви використовуєте значення lat / long, можливо, ви зможете використовувати geohashes як частину цінності вашого магазину.

Ось для NYC. dr5regy6rc6ye

За допомогою geohash ви можете почати збивати символи в кінці геогаша, щоб отримати сітку різної точності: http://geohash.org/dr5re

Приклад реалізації js: http://github.com/davetroy/geohash-js


1

У більшості випадків ви отримаєте більше корисності від реляційного зберігання даних, ніж від зберігання ключа / значення або ключа / значення / типу. Існує значна складність щодо ефективного запиту та звітування про подібну схему даних.

Моя порада полягає в тому, щоб уважно оцінити, чи потрібна ваша шкала фактично NoSQL, перш ніж розглянути, як її використовувати.


1
Ось приклад проблеми, яка може виникнути (і рішення її), якщо вам потрібно обчислити, чи точка в геометрії або поза нею. code.google.com/p/giscloud/wiki/SerializedSpatialIndexes
Джон Брінгхерст

Привіт @Jon, це було б краще додати як відповідь. Таким чином він може стояти самостійно, і ви отримаєте за це заслугу, якщо люди думають, що це заслуга!
JasonBirch


1


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.