合并两个大数据帧时出现内存错误

问题描述

我需要一些帮助。

主要问题是计算两点之间的距离及其纬度和经度。我们将巴西划分为 33k 个六边形,列在下面的数据框中:

image

我一直在尝试将此数据框与其副本合并,因此我将拥有一个包含这些六边形的所有组合的 10 亿行数据框,并使用此函数计算它们之间的距离:

def get_distance(lat_1,lng_1,lat_2,lng_2): 
    d_lat = lat_2 - lat_1
    d_lng = lng_2 - lng_1 

    temp = (  
         np.sin(d_lat / 2) ** 2 
       + np.cos(lat_1) 
       * np.cos(lat_2) 
       * np.sin(d_lng / 2) ** 2
    )
    
    #print('a')

    return 6373.0 * (2 * np.arctan2(np.sqrt(temp),np.sqrt(1 - temp))) * 1.4 * 1000

我尝试将它们与 Pandas 合并,但出现内存错误(需要 8GB),因此我使用 Vaex 库将数据转换为 hdf5 文件。但是,当我尝试将它们与此代码合并时,我得到了同样的错误

with h5py.File('mergedfs','w') as hdf:
    hdf.create_dataset('datasetmerge',data = dvv.join(dvv2,left_on='key',right_on='key2',how='left',allow_duplication=True))

有没有人经历过这样的事情?我提前感谢您的帮助。

另外,如果您有任何替代解决方案,我很高兴听到!

解决方法

如果没有用于您的数据集的 dytpe,我无法编写准确的解决方案。但是,当我查看您的代码和文件图像时,我可以猜测伪代码应该是什么样子。见下文。我为您的 HDF5 文件和数据集使用了假名。我使用图像中显示的列/字段名称作为纬度和经度数据。这只是循环,调用 get_distance() 来计算距离并将值返回为 dist_i_j。注意:我按原样调用您的函数 get_distance()。希望这会让你开始。或者,如果您可以提供有关 dtype(或一些示例数据)的更多信息,我可以微调代码。祝你好运!

with h5py.File('not_mergedfs','w') as hdf:
    data=h5f['ds_name']
    
    for i in range (32882):
        lat_1 = data[i]['lat']
        lng_1 = data[i]['lon']
  
        for j in range (i+1,32882):
            lat_2 = data[j]['lat']
            lng_2 = data[j]['lon']
    
            dist_i_j = get_distance(lat_1,lng_1,lat_2,lng_2)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...