大文件是1200万行这样的文本:
81.70, 89.86, 717.985
81.74, 89.86, 717.995
81.78, 89.86, 718.004
81.82, 89.86, 718.014
81.86, 89.86, 718.024
81.90, 89.86, 718.034
分别是纬度,经度和距最近海岸线的距离。
我的代码使用已知地点的坐标(例如:墨西哥城:“-99.1、19.4”)并逐行搜索大文件,以输出距该坐标最近的海岸线的距离。
我将每一行放入列表中,因为许多行都符合长/短条件。后来我平均了到海岸线的距离。
每个坐标大约需要12秒钟来检索。我的整个脚本需要14分钟才能完成。
这就是我一直在使用的:
long = -99.1
lat = 19.4
country_d2s = []
# outputs all list items with specified long and lat values
with open(r"C:\Users\jason\OneDrive\Desktop\s1186prXbF0O", 'r') as dist2sea:
for line in dist2sea:
if long in line and lat in line and line.startswith(long):
country_d2s.append(line)
我正在寻找一种更快地搜索文件和/或重写文件以使其更易于使用的方法。
答案 0 :(得分:3)
使用具有由纬度和经度组成的键的数据库。如果您正在寻找可以作为文件共享的轻量级数据库,则可以使用SqliteDict或bsddb3。这将比每次运行程序时读取文本文件快得多。
答案 1 :(得分:2)
将数据导入SQLite数据库,然后为(latitude, longitude)
创建索引。索引查找应花费毫秒。要读取数据,请使用python SQLite模块。
答案 2 :(得分:1)
评论:
XX.Y
的事实,并且是否要以某种模糊匹配技术来搜索XX.YY
。load + [run] x 1000
与[load + run] x 1000
,这将告知您要使用的解决方案。话虽如此,如果您想非常快速地进行精确查找,一种选择是将整个对象作为映射加载到内存中,例如{(long, lat): coast_distance, ...}
。由于浮点数不是好的键,因此最好使用字符串,整数或分数。
如果要进行模糊匹配,可以使用一些数据结构(和许多程序包)来解决该问题:
如果希望初始加载时间更快,可以执行一些操作,例如编写二进制pickle并直接加载而不是解析文件。数据库也是对此的简单解决方案。
答案 3 :(得分:0)
您可以将文件分成10 x 10度的补丁。这将减少648个搜索空间,这将产生648个文件,每个文件包含约18500行。这样可以将搜索时间减少到0.02秒左右。
在进行lat-long的精确匹配时,可以改用任何磁盘键值存储。 Python至少内置了其中之一。如果您正在进行最近邻居或度量空间搜索,则有支持这些的空间数据库。
答案 4 :(得分:0)
如果您使用的是python,建议您使用PySpark。 在这种情况下,您可以使用功能mapPartitions并加入结果。 这可以帮助How does the pyspark mapPartitions function work?
PySpark在处理大量数据时非常有用,因为它可以划分N个分区并充分利用处理器的力量。
希望它对您有帮助。