重复搜索大型文本文件(800 MB)中某些数字的最有效方法是什么?

时间:2019-07-19 20:27:40

标签: python large-files writetofile

大文件是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)

我正在寻找一种更快地搜索文件和/或重写文件以使其更易于使用的方法。

5 个答案:

答案 0 :(得分:3)

使用具有由纬度和经度组成的键的数据库。如果您正在寻找可以作为文件共享的轻量级数据库,则可以使用SqliteDictbsddb3。这将比每次运行程序时读取文本文件快得多。

答案 1 :(得分:2)

将数据导入SQLite数据库,然后为(latitude, longitude)创建索引。索引查找应花费毫秒。要读取数据,请使用python SQLite模块。

答案 2 :(得分:1)

评论:

  • 目前尚不清楚您是否使用了long / lat为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个分区并充分利用处理器的力量。

希望它对您有帮助。