好吧,深呼吸,这可能有点冗长,但更好的是在细节方面而不是缺乏......
所以,在一句话中,我的目标是根据139个属性中的3个找到约22~300-400mb文件的交集。:
现在有点背景了。文件范围从~300-400mb,由139列组成,通常在400,000-600,000行的范围内。我有三个我想加入的特定字段 - 一个唯一的ID,以及纬度/经度(如果可能的话,有一点容差)。目标是确定在某些文件范围内存在哪些记录。在最糟糕的情况下,这将意味着执行22文件交叉。
到目前为止,以下内容已失败
我尝试使用MySQL来执行连接。当我只看了7年时,这又回来了。尝试连接7年(使用INNER JOIN大约7次......例如t1 INNER JOIN t2 ON条件INNER JOIN t3 ON条件......等),我让它在超时结束前运行大约48小时。它可能真的还在运行,还是看起来过长?尽管我发现所有的建议都能实现更好的多线程和更多的RAM使用,但我似乎无法将CPU使用率提高到25%以上。如果这是一个很好的方法,那么任何提示都会非常感激。
我尝试使用ArcMap。我将CSV转换为表并将它们导入到文件地理数据库中。我在两个文件上运行了交叉工具,大约需要4天,返回的记录数是输入功能组合数的两倍多。每个文件有大约600,000条记录。交叉口返回了2,000,0000个结果。在其他情况下,并非所有记录都被ArcMap识别。 ArcMap表示有5,000条记录,实际上有400,000 +
我尝试在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的RAM可用,22个文件需要~44GB的RAM。我可以更改它,以便在每个uniqueID被迭代时,它会打开并解析具有该唯一ID的行的每个文件。这样做的好处是可以将占用空间减少到几乎没有,但是有数十万个唯一ID,这可能需要花费不合理的时间来执行。
所以,我在这里,询问有关如何最好地处理这些数据的建议。我有一个4.47Gh的i7-3770k,16GB内存和一个顶点4 SSD,额定速度为560 MB / s。这台机器甚至能够处理这么多数据吗?
我考虑探索的另一个场所是Amazon EC2群集和Hadoop。这是一个更好的想法来调查吗?
答案 0 :(得分:0)
建议:预先处理所有文件,以便首先提取您感兴趣的3个属性。您也可以随时跟踪文件/ rownumber,以便您可以在以后引用所有原始属性。