簡體   English   中英

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

[英]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)

我正在尋找一種更快地搜索文件和/或重寫文件以使其更易於使用的方法。

使用具有由緯度和經度組成的鍵的數據庫。 如果您正在尋找可以作為文件共享的輕量級數據庫,則可以使用SqliteDictbsddb3 這將比每次運行程序時讀取文本文件快得多。

將數據導入SQLite數據庫,然后為(latitude, longitude)創建索引。 索引查找應花費毫秒。 要讀取數據,請使用python SQLite模塊。

評論:

  • 尚不清楚您是否使用了您的長/ XX.YXX.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM