Как мне разделить очень большой файл OpenStreetMap на файлы меньшего размера в R без нехватки памяти?
В настоящее время я ищу файлы карт, которые не превышают размеры муниципалитетов в Мексике (самое большее, около 3 градусов по долготе / широте поперек). Тем не менее, я столкнулся с проблемами памяти (по крайней мере) при попытке сделать это. Размер файла объекта OSM XML составляет 1,9 ГБ, для справки.
library(osmar)
get.map.for.municipality<-function(province,municipality){
base.map.filename = 'OpenStreetMap/mexico-latest.osm'
#bounds.list is a list that contains the boundaries
bounds = bounds.list[[paste0(province,'*',municipality)]]
my.bbox = corner_bbox(bounds[1],bounds[2],bounds[3],bounds[4])
my.map.source = osmsource_file(base.map.filename)
my.map = get_osm(my.bbox,my.map.source)
return(my.map)
}
Я запускаю это внутри цикла, но он не может даже пройти первый. Когда я попытался запустить его, мой компьютер завис, и я смог сделать только снимок экрана с моим телефоном. Память постоянно наклонялась в течение нескольких минут, а потом очень быстро взорвалась, и я не смог среагировать, пока компьютер не завис.
Какой лучший способ сделать это? Я ожидаю, что мне придется выполнить этот цикл примерно 100-150 раз, так что любой способ, более эффективный с точки зрения памяти, мог бы помочь. Я бы предпочел не загружать файлы меньшего размера из службы API. При необходимости я хотел бы использовать другой язык программирования (предпочтительно Python или C++), но я предпочитаю оставить это в R.
1 ответ
Я бы предложил не использовать R для этого.
Есть лучшие инструменты для этой работы. Много способов разбить, отфильтровать вещи из командной строки или с помощью СУБД.
Вот некоторые альтернативы, извлеченные из вики OSM http://wiki.openstreetmap.org/:
Фильтруйте ваши файлы osm с помощью osmfilter: "osmfilter используется для фильтрации файлов данных OpenStreetMap по определенным тегам. Вы можете определить различные типы фильтров для получения объектов OSM (то есть узлов, путей, отношений), включая их зависимые объекты, например, узлы путей, способы отношений, отношения других отношений."
Обрезка на основе полигонов или границ с помощью osmconvert: http://wiki.openstreetmap.org/wiki/Osmconvert
Вы можете написать сценарии bash для osmfilter и osmconvert, но я бы порекомендовал использовать СУБД. Просто импортируйте в PostGIS, используя osm2pgsql, и подключите ваш R-код к любому драйверу Postgresql. Это оптимизирует ваши операции чтения / записи.