Позвольте мне начать с того, что я исчерпал все различные варианты, которые я мог придумать самостоятельно, и исследовал каждый вариант для всех видимых тупиков.
У меня есть типичная база данных 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-адреса, сравнения его с базой геолокаций и широты и долготы. Но при работе с миллионами строк я не знаю, как добраться до моего конечного результата.
Любые советы по новым подходам или помощь с моими тупиками будут весьма признательны.
Мы будем генерировать некоторые 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")
Вы можете видеть, что я имею в виду "слишком однородный". Но у вас есть "реальные" IPv4, поэтому вы должны быть gtg.
Подумайте об использовании scale_size_area()
, но, честно говоря, не рассматривайте возможность создания IPv4 на географической карте вообще. Я делаю интернет-исследования для жизни, и требования к точности оставляют желать лучшего. По этой причине я редко опускаю атрибуты на уровне страны (и мы платим за "реальные" данные).
rgeolocate
, который может использовать бесплатные базы данных MaxMind и геокодировать эти IP-адреса за секунду или две (в буквальном смысле) и вернуть вам пары lat / lon или все, что вам нужно? Я имею в виду, что поиск в Google по запросу «r geolocate ip address» ставит этот пакет, который я в соавторстве, на месте № 1 и № 2, а также cpl других пакетов, в которых я участвовал (которые требуют вызовов API), в более низкие места. FWIWrgeolocate::maxmind()
будет также выполнять миллионы IP-адресов в считанные секунды.