[英]What is the most efficient way to repeatedly search a large text file (800 MB) for certain numbers?
大文件是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)
我正在尋找一種更快地搜索文件和/或重寫文件以使其更易於使用的方法。
使用具有由緯度和經度組成的鍵的數據庫。 如果您正在尋找可以作為文件共享的輕量級數據庫,則可以使用SqliteDict或bsddb3 。 這將比每次運行程序時讀取文本文件快得多。
將數據導入SQLite數據庫,然后為(latitude, longitude)
創建索引。 索引查找應花費毫秒。 要讀取數據,請使用python SQLite模塊。
評論:
XX.Y
為XX.Y
的事實,並且您正在搜索XX.YY
作為某種模糊匹配技術。 load + [run] x 1000
vs [load + run] x 1000
,這將告知您要使用的解決方案。 話雖這么說,如果您想非常快速地進行精確查找,一種選擇是將整個對象作為映射加載到內存中,例如{(long, lat): coast_distance, ...}
。 由於浮點數不是好的鍵,因此最好使用字符串,整數或分數。
如果要進行模糊匹配,則可以使用數據結構(和許多程序包)來解決該問題:
如果希望初始加載時間更快,可以執行一些操作,例如編寫二進制pickle並直接加載而不是解析文件。 數據庫也是對此的簡單解決方案。
您可以將文件划分為10 x 10度的補丁。 這將減少648個搜索空間,這將產生648個文件,每個文件包含約18500行。 這會將搜索時間減少到大約0.02秒。
在進行lat-long的精確匹配時,可以改用任何磁盤鍵值存儲。 Python至少內置了其中之一。如果您正在進行最近鄰居或度量空間搜索,則有支持這些的空間數據庫。
如果您使用的是python,建議您使用PySpark。 在這種情況下,您可以使用功能mapPartitions並加入結果。 這可以幫助pyspark mapPartitions函數如何工作?
PySpark在處理大量數據時非常有用,因為它可以划分N個分區並充分利用處理器的能力。
希望對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.