python—一种高效的方法,可以将包含地理数据的多个大型文件相交

mspsb9vt  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(222)

好吧,深呼吸,这可能有点冗长,但最好是在细节方面出错,而不是缺乏细节。。。
因此,在一句话中,我的目标是根据139个属性中的3个找到22~300-400mb文件的交集:
现在有点背景了。这些文件的大小介于~300-400mb之间,由139列组成,通常为400000-600000行。我有三个我想加入的特定字段-一个唯一的id和纬度/经度(如果可能的话有一点公差)。目标是确定这些记录中的哪些存在于特定范围的文件中。最坏的情况是,这将意味着执行22个文件的交叉。
到目前为止,以下几点都失败了
我尝试使用mysql执行连接。这是在我只有7年的时候。尝试连接7年(使用内部连接约7次。。。e、 t1内连接t2内连接t3内连接t2内连接t3内连接。。。等等),我让它运行了大约48小时,然后超时结束了它。它很可能仍在运行,还是看起来太长了?尽管我发现有很多建议可以实现更好的多线程和更多的ram使用率,但我似乎无法将cpu使用率提高到25%以上。如果这是一个很好的方法来追求,任何提示将不胜感激。
我试着用arcmap。我将csv转换为表,并将它们导入到一个文件数据库中。我在两个文件上运行了intersection工具,花了大约4天时间,返回的记录数是输入特性总数的两倍多。每个文件有大约60万条记录。交叉点返回20000000个结果。在其他情况下,并非所有记录都能被arcmap识别。arcmap说有5000条记录,而实际上有40万条+
我试着用python组合。首先,我可以马上告诉你ram会成为一个问题。在python中,完全打开每个文件时大约占用2gb的ram。我是这样做的:

f1 = [row for row in csv.reader(open('file1.csv', 'rU'))]
f2 = [row for row in csv.reader(open('file2.csv', 'rU'))]
joinOut = csv.writer(open('Intersect.csv', 'wb'))
uniqueIDs = set([row[uniqueIDIndex] for row in f1].extend([row[uniqueIDIndex] for row in f2]))
for uniqueID in uniqueIDs:
    f1rows = [row for row in f1 if row[uniqueIDIndex] == uniqueID]
    f2rows = [row for row in f2 if row[uniqueIDIndex] == uniqueID]
    if len(f1rows) == 0 or len(f2rows) == 0:
        //Not an intersect
    else:
        // Strings, split at decimal, if integer and first 3 places
        // after decimal are equal, they are spatially close enough
        f1lat = f1rows[0][latIndex].split('.')
        f1long = f1rows[0][longIndex].split('.')
        f2lat = f2rows[0][latIndex].split('.')
        f2long = f2rows[0][longIndex].split('.')
        if f1lat[0]+f1lat[1][:3] == f2lat[0]+f2lat[1][:3] and f1long[0]+f1long[1][:3] == f2long[0]+f2long[1][:3]:
            joinOut.writerows([f1rows[0], f2rows[0]])

显然,这种方法要求被相交的文件在内存中可用。嗯,我只有16gb的内存可用,22个文件将需要约44gb的内存。我可以修改它,这样当每个uniqueid被迭代时,它就会打开并解析每个文件中具有该uniqueid的行。这样做的好处是将占用的空间减少到几乎为零,但是使用数十万个唯一的id,这可能会花费不合理的时间来执行。
所以,我在这里,寻求关于如何最好地处理这些数据的建议。我有一个i7-3770k,4.4ghz,16gbram,和一个vertex4ssd,读取速度为560mb/s。这台机器能处理这么多的数据吗?
我想探索的另一个地方是amazonec2集群和hadoop。这是一个更好的调查方法吗?

6yt4nkrj

6yt4nkrj1#

建议:先对所有文件进行预处理,提取出你感兴趣的3个属性。您还可以随时跟踪文件/行号,以便以后可以根据需要引用所有原始属性。

相关问题