Самый быстрый подход для геопанд (чтение и пространственное соединение)

У меня есть около миллиона строк данных с привязанными широтами и долготами, и это еще не все. Даже сейчас чтение данных из файла SQLite (я читаю его с помощью pandas, а затем создаю точку для каждой строки) занимает много времени.

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

Поэтому мне интересно: есть ли относительно простой способ распараллелить эти вычисления?


person Philipp_Kats    schedule 23.02.2016    source источник


Ответы (3)


Я предполагаю, что вы уже внедрили GeoPandas и все еще испытываете трудности? вы можете улучшить это путем дальнейшего хеширования ваших данных coords. аналогично тому, как Google хэширует свои поисковые данные. Некоторые базы данных уже предоставляют поддержку этих типов операций (например, mongodb). Представьте, что вы взяли первую (левую) цифру своих координат и поместили каждый набор соответствующих данных в отдельный файл sqlite. каждая цифра может быть хешем, указывающим на нужный файл. теперь время поиска увеличилось в 20 раз (range(-9,10)), при условии, что поиск по хешу занимает минимальное время по сравнению

person bmbigbang    schedule 23.02.2016
comment
да, я использую геопанды с rtree. Спасибо, что поделились информацией о хешировании - звучит хорошо. Однако дело в том, что у меня есть доступ к кластеру машин и я использую его для других вычислений - однако я понял, что понятия не имею, как реализовать распараллеливание в пандах. Должен ли я разделить фрейм данных на генератор и запускать задачи в простом mp.pool? - person Philipp_Kats; 23.02.2016
comment
Я не знаю о процессе распараллеливания для процессов поиска / соединения в базе данных. для реализации моего предложения создайте словарь с диапазоном ключей (-9,10) и значениями, указывающими на файлы, содержащие соответствующие данные. этот способ поиска нужного числа вам нужно просматривать меньше данных, и поэтому будет быстрее выполнять соединения - person bmbigbang; 24.02.2016

Как оказалось, наиболее удобным решением в моем случае является использование функции pandas.read_SQL с конкретным параметром chunksize. В этом случае он возвращает генератор блоков данных, которые можно эффективно передать в mp.Pool (). Map () вместе с заданием; В этом (моем) случае работа состоит из 1) чтения географических границ, 2) пространственного соединения фрагмента, 3) записи фрагмента в базу данных.

person Philipp_Kats    schedule 04.03.2016
comment
Обновление: прямо сейчас есть необработанная бета-версия Dask-Geopandas, которая теоретически может все распараллелить автоматически - person Philipp_Kats; 18.04.2018

Этот метод полностью зависит от вашего пространственного масштаба, но один из способов распараллеливания соединения - это разделение полигонов на субполигоны и последующая разгрузка работы для разделения потоков в отдельных ядрах. В этом руководстве r-tree geopandas демонстрируется этот метод, разделяя большой многоугольник на множество мелких и пересекающий каждый большой набор точек. Но опять же, это работает только в том случае, если ваш пространственный масштаб подходит: то есть несколько многоугольников и много точек (например, несколько многоугольников почтового индекса и миллионы точек внутри и вокруг них).

person eos    schedule 27.10.2016