Я хочу использовать multiprocessing
на большом наборе данных, чтобы найти расстояние между двумя точками gps. Я построил тестовый набор, но мне не удалось получить multiprocessing
для работы над этим набором.
import pandas as pd
from geopy.distance import vincenty
from itertools import combinations
import multiprocessing as mp
df = pd.DataFrame({'ser_no': [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
'co_nm': ['aa', 'aa', 'aa', 'bb', 'bb', 'bb', 'bb', 'cc', 'cc', 'cc'],
'lat': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'lon': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]})
def calc_dist(x):
return pd.DataFrame(
[ [grp,
df.loc[c[0]].ser_no,
df.loc[c[1]].ser_no,
vincenty(df.loc[c[0], x],
df.loc[c[1], x])
]
for grp,lst in df.groupby('co_nm').groups.items()
for c in combinations(lst, 2)
],
columns=['co_nm','machineA','machineB','distance'])
if __name__ == '__main__':
pool = mp.Pool(processes = (mp.cpu_count() - 1))
pool.map(calc_dist, ['lat','lon'])
pool.close()
pool.join()
Я использую Python 2.7.11 и Ipython 4.1.2 с Anaconda 2.5.0 64-бит в Windows7 Professional при возникновении этой ошибки.
runfile ('C:/.../Desktop/multiprocessing test.py', wdir = 'C:/.../Desktop') Traceback (последний последний звонок):
Файл ", строка 1, в runfile ('C:/.../Desktop/multiprocessing test.py', wdir = 'C:/.../Desktop')
Файл" C:...\Local\Continuum\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py ", строка 699, в файле запуска execfile (имя файла, пространство имен)
Файл" C:...\Local\Continuum\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py ", строка 74, в execfile exec (компиляция (scripttext, filename, 'exec'), glob, loc)
Файл" C:/..../multiprocessing test.py ", строка 33, в pool.map(calc_dist, ['lat', 'lon'])
Файл" C:...\AppData\Local\Continuum\Anaconda2\lib\multiprocessing\pool.py ", строка 251, на карте return self.map_async (func, iterable, chunksize).get()
Файл" C:...\Local\Continuum\Anaconda2\lib\multiprocessing\pool.py", строка 567, в get raise self._value
TypeError: не удалось создать экземпляр Point из 1.
def get(self, timeout=None):
self.wait(timeout)
if not self._ready:
raise TimeoutError
if self._success:
return self._value
else:
raise self._value