Геолокация большого количества постов на основе IP-адресов. (880 000 строк)

0

Позвольте мне начать с того, что я исчерпал все различные варианты, которые я мог придумать самостоятельно, и исследовал каждый вариант для всех видимых тупиков.

У меня есть типичная база данных mysql, в которую входит стол для post с примерно 880 000 строк. post таблица содержит столбец для IP - адреса, и моя конечная цель заключается в создании пузыря карты мира на основе геолокации каждого поста. Еще лучше, если я могу разделить их в месяц и создать анимацию пост-частоты во всем мире в течение последних 8 лет.

Поскольку это персональный проект, и точность геолокации IP не важна, мне пришлось исключать платные API, которые могут конвертировать IP в геолокацию. Я нашел различные вопросы о stackoverflow, которые связаны с сайтом с базами данных геолокации IP: https://dev.maxmind.com/geoip/geoip2/geolite2/

Мой первоначальный план состоял в том, чтобы загрузить эту базу данных на мой сервер форумов и использовать мой опыт работы с mysql для создания новой таблицы с помощью: postid, date (как временная отметка unix), широты, долготы, города, страны. Затем экспортируйте эту таблицу в R и создайте все карты и диаграммы, которые я когда-либо захочу. Тем не менее, база данных геолокации насчитывает более 3 миллионов строк по двум таблицам, а мой мертвый форум находится на простом общедоступном хостинговом плане, который не позволяет LOAD DATA. Я пробовал все решения в этих вопросах, не повезло: как импортировать CSV файл в доступ к таблице MySQL, запрещенный для загрузки данных infile в MySQL LOAD DATA INFILE в PHPmyadmin PHPMyAdmin, говорящий: Использованная команда не допускается с этой версией MySQL

Поэтому моя следующая идея заключалась в том, чтобы экспортировать соответствующие столбцы из моей таблицы сообщений в.csv или.xml, а затем загрузить их в мою учетную запись на iacademy3.oracle.com. Тем не менее, я не испытываю оракула, и единственным способом, который я знал, является пользовательский интерфейс Load Load/Unload в Data Workshop. Не удалось загрузить XML файл 177MB со следующей ошибкой:

ORA-31011: XML parsing failed ORA-19202: Error occurred in XML processing LPX-00222: error received from SAX callback function


Error loading XML.
Return to application.

34MB. CSV файл не удалось загрузить с двумя попытками с этой ошибкой:

Failure of Web Server bridge:
No backend server available for connection: timed out after 10 seconds or idempotent set to OFF or method not idempotent.

Теперь у меня нет идей. На почтовом основании это простой запрос для поиска IP-адреса, сравнения его с базой геолокаций и широты и долготы. Но при работе с миллионами строк я не знаю, как добраться до моего конечного результата.

Любые советы по новым подходам или помощь с моими тупиками будут весьма признательны.

  • 1
    Возможно, вы сможете установить MySQL на свой ПК и загрузить туда данные.
  • 0
    Почему бы вам просто не использовать пакет rgeolocate , который может использовать бесплатные базы данных MaxMind и геокодировать эти IP-адреса за секунду или две (в буквальном смысле) и вернуть вам пары lat / lon или все, что вам нужно? Я имею в виду, что поиск в Google по запросу «r geolocate ip address» ставит этот пакет, который я в соавторстве, на месте № 1 и № 2, а также cpl других пакетов, в которых я участвовал (которые требуют вызовов API), в более низкие места. FWIW rgeolocate::maxmind() будет также выполнять миллионы IP-адресов в считанные секунды.
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Мы будем генерировать некоторые IP-адреса, geolocate tem и строить их:

library(iptools)
library(rgeolocate)
library(tidyverse)

Создайте миллион (слишком равномерно распределенных) случайных IPv4-адресов:

ips <- ip_random(1000000)

И, geolocate их:

system.time(
  rgeolocate::maxmind(
    ips, "~/Data/GeoLite2-City.mmdb", c("longitude", "latitude")
  ) -> xdf
)
##    user  system elapsed 
##   5.016   0.131   5.217 

5s для 1m IPv4s.

Теперь из-за однородности пузырьки будут глупыми, поэтому просто для этого примера мы их немного округлим:

xdf %>% 
  mutate(
    longitude = (longitude %/% 5) * 5,
    latitude = (latitude %/% 5) * 5
  ) %>%  
  count(longitude, latitude) -> pts

И, заговорите их:

ggplot(pts) +
  geom_point(
    aes(longitude, latitude, size = n), 
    shape=21, fill = "steelblue", color = "white", stroke=0.25
  ) +
  ggalt::coord_proj("+proj=wintri") +
  ggthemes::theme_map() +
  theme(legend.justification = "center") +
  theme(legend.position = "bottom")

Изображение 174551

Вы можете видеть, что я имею в виду "слишком однородный". Но у вас есть "реальные" IPv4, поэтому вы должны быть gtg.

Подумайте об использовании scale_size_area(), но, честно говоря, не рассматривайте возможность создания IPv4 на географической карте вообще. Я делаю интернет-исследования для жизни, и требования к точности оставляют желать лучшего. По этой причине я редко опускаю атрибуты на уровне страны (и мы платим за "реальные" данные).

  • 0
    Итак, что касается R, я должен узнать все об этом в течение следующих четырех месяцев. Из моего очень ограниченного чтения я подумал, что мне нужно будет подготовить одну таблицу данных. Вот почему я пытался подготовить свои данные, прежде чем перейти к части R. Инструменты, которые вы создали, впечатляют! Я определенно буду использовать это, чтобы собрать свои карты.
  • 0
    Вы были так полезны прежде, я надеюсь, что вы могли бы помочь мне еще раз stackoverflow.com/questions/53194740/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню