Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并行处理-使用pysal python进行最近邻搜索?_Python_Python 2.7_Multiprocessing_Python Multiprocessing_Pysal - Fatal编程技术网

并行处理-使用pysal python进行最近邻搜索?

并行处理-使用pysal python进行最近邻搜索?,python,python-2.7,multiprocessing,python-multiprocessing,pysal,Python,Python 2.7,Multiprocessing,Python Multiprocessing,Pysal,我有一个数据帧df1 id lat_long 400743 2504043 (175.0976323, -41.1141412) 43203 1533418 (173.976683, -35.2235338) 463952 3805508 (174.6947496, -36.7437555) 1054906 3144009 (168.0105269, -46.36193) 214474 3030933 (174.6311167, -36.867717) 1

我有一个数据帧df1

          id      lat_long
400743  2504043 (175.0976323, -41.1141412)
43203   1533418 (173.976683, -35.2235338)
463952  3805508 (174.6947496, -36.7437555)
1054906 3144009 (168.0105269, -46.36193)
214474  3030933 (174.6311167, -36.867717)
1008802 2814248 (169.3183615, -45.1859095)
988706  3245376 (171.2338968, -44.3884099)
492345  3085310 (174.740957, -36.8893026)
416106  3794301 (174.0106383, -35.3876921)
937313  3114127 (174.8436185, -37.80499)
我在这里建造了一棵搜索树

def construct_geopoints(s):
    data_geopoints = [tuple(x) for x in s[['longitude','latitude']].to_records(index=False)]
    tree = KDTree(data_geopoints, distance_metric='Arc', radius=pysal.cg.RADIUS_EARTH_KM)
    return tree

tree = construct_geopoints(actualdata)
现在,我正在尝试搜索数据帧df1中每个地质点1KM范围内的所有地质点。我是这样做的

dfs = []
for name,group in df1.groupby(np.arange(len(df1))//10000):
    s = group.reset_index(drop=True).copy()
    pts = list(s['lat_long'])
    neighbours = tree.query_ball_point(pts, 1)
    s['neighbours'] = pd.Series(neighbours)
    dfs.append(s)

output = pd.concat(dfs,axis = 0)
这里的一切都很好,但是我正在尝试并行化这个任务,因为我的df1大小是2M记录,这个过程运行了8个多小时。有人能帮我吗?另一件事是,query\u ball\u point返回的结果是一个列表,所以当我处理大量记录时,它抛出内存错误。任何处理这件事的方法

编辑:-内存问题,查看VIRT大小


应该可以用如下方式并行化最后一段代码:

from multiprocessing import Pool
...

def process_group(group):
    s = group[1].reset_index(drop=True)  # .copy() is implicit
    pts = list(s['lat_long'])
    neighbours = tree.query_ball_point(pts, 1)
    s['neighbours'] = pd.Series(neighbours)
    return s

groups = df1.groupby(np.arange(len(df1))//10000)

p = Pool(5)
dfs = p.map(process_group, groups)

output = pd.concat(dfs, axis=0)
但请注意,因为多处理库会在往返于worker的过程中对所有数据进行pickle,这会为数据密集型任务增加大量开销,可能会抵消并行处理带来的节省

我看不出你会从哪里得到内存错误。800万张唱片对大熊猫来说并不算多。如果您的搜索每行生成数百个匹配项,可能会出现问题。如果你多说一点,我也许能给你更多的建议

听起来pysal可能需要更长的时间来完成这项工作。通过使用或滚动您自己的解决方案,您可能会获得更好的性能,如下所示:

from multiprocessing import Pool
...

def process_group(group):
    s = group[1].reset_index(drop=True)  # .copy() is implicit
    pts = list(s['lat_long'])
    neighbours = tree.query_ball_point(pts, 1)
    s['neighbours'] = pd.Series(neighbours)
    return s

groups = df1.groupby(np.arange(len(df1))//10000)

p = Pool(5)
dfs = p.map(process_group, groups)

output = pd.concat(dfs, axis=0)
将每个点指定给周围1公里的网格单元,例如,计算UTM坐标x和y,然后创建列cx=x//1000和cy=y//1000; 在网格单元坐标cx和cy上创建索引,例如,df=df。设置_索引['cx','cy']; 对于每个点,在9个周围单元中找到点;您可以通过df.loc[[cx-1,cy-1,cx-1,cy,cx-1,cy+1,cx,cy-1; 过滤您刚刚选择的点,以查找1公里内的点。
谢谢你的回复,现在让我通读一遍,只是为了回答你的记忆相关问题,是的,每个搜索结果将在一个列表中提供1000多个元素。是否可以将其转换为元组?因此,对于800万个点中的每一个,你将获得大约80亿个元素来处理1000个匹配?这将导致内存问题。根据您的工作流程,您可以将每个批存储到磁盘以供以后处理,也可以在同一个辅助进程中进一步处理列表,以便在返回之前将其缩小到可管理的大小,或者两者的某种组合。它不是800万条记录,而是200万条记录。让我用问题更新屏幕截图。你可以看到内存是如何积累的,也许我会尝试使用imap而不是map来查看它是如何利用内存的。是的,然后我必须按照你的建议进行尝试,我会在同一个工作人员中进一步处理列表,在返回之前将其缩小到可管理的大小。