【发布时间】:2021-03-13 13:51:35
【问题描述】:
我有一个大约 1900 万行的数据框,其中 4 个变量是纬度和经度。我在 python haversine 包的帮助下创建了一个计算纬度和经度距离的函数。
# function to calculate distance of 2 coordinates
def measure_distance(lat_1, long_1, lat_2, long_2):
coordinate_start = list(zip(lat_1, long_1))
coodrinate_end = list(zip(lat_2, long_2))
distance = haversine_vector(coordinate_start, coodrinate_end, Unit.KILOMETERS)
return distance
我使用魔术命令%%memit 来测量内存使用情况以执行计算。平均而言,内存使用量在 8 - 10 GB 之间。我在具有 12GB RAM 的 Google Colab 上运行我的工作,结果,有时操作达到运行时限制并重新启动。
%%memit
measure_distance(df.station_latitude_start.values,
df.station_longitude_start.values,
df.station_latitude_end.values,
df.station_longitude_end.values)
peak memory: 7981.16 MiB, increment: 5312.66 MiB
有没有办法优化我的代码?
【问题讨论】:
-
您的输入数据帧使用了多少内存(维度和字节),您预计输出距离数组会占用多少内存?您的数据集可能太大,您的机器无法在计算期间复制数据。
list(zip...行肯定会复制您的数据,haversine_vector函数可能会生成临时中间数组。 -
与
.info(),我可以看出数据框正在使用大约 600 MB 内存。我没有具体的期望,只是想在看到 Google Colab 崩溃时找出该命令的内存使用情况。我尝试创建coordinate_start和coordinate_end然后在haversine中使用它们,每个操作都使用8GB 的内存。因此,我决定将所有内容都包装在函数中,看看有什么不同。最后,内存使用情况几乎相同,有/没有功能。我的目标是减少内存使用量,这样 Google Colab 就不会崩溃。 -
600 MB 固然很大,但 12 GB 可以提供 20 个副本(远低于此值,因为内存还用于其他用途)。我怀疑
haversine_vector只是制作了太多临时数组。如果您不运行haversine_vector函数,请尝试查看使用了多少内存(通过在前面键入#将其注释掉)。文档建议它返回一个与输入长度相同的 numpy 距离数组,因此您可以返回一个虚拟值distance = numpy.zeros(len(coordinate_start))。如果内存使用量急剧下降,那么我们可以确定是haversine_vector的错。
标签: python performance google-colaboratory haversine