簡體   English   中英

搜索大型排序文本文件的最快和最有效的方法

[英]Quickest and most efficient way to search large sorted text file

我有一個大型靜態文本/csv 文件,其中包含大約 10 萬行 (2MB)。 它本質上是一個字典,我需要在 Python 中對這些數據執行定期查找。

文件格式為:

    key         value1       value2     
    alpha       x1           x2
    alpha beta  y1           y2
    gamma       z1           z2  
    ...
  • 鍵可以是多字串。
  • 該列表按鍵的字母順序排序
  • 值是字符串

這是 Web 應用程序的一部分,其中每個用戶將一次查找 100-300 個鍵,並且期望為每個鍵獲得值 1 和值 2。 應用程序上將有多達 100 個用戶,每個用戶在同一數據上查找這 100-300 個鍵。

我只需要返回第一個完全匹配。 例如,如果用戶搜索鍵[alpha, gamma] ,我只需要返回[('x1','x2'), ('z1','z2')] ,它表示第一個完全匹配的“阿爾法”和“伽馬”。

我一直在閱讀有關我擁有的選項的信息,我真的很喜歡您對以下哪種方法最適合我的用例的意見。

  1. 將文件一次讀入有序集合,並執行 200 次左右的查找。 但是,對於每個使用該應用程序的用戶(~100),該文件將被加載到內存中。

  2. 將文件讀入一次列表,並使用二分查找(例如bisect )。 與 1.) 類似的問題,對於每個需要進行搜索的用戶,該文件將被加載到內存中。

  3. 不要將整個文件讀入內存,而只是一次讀取文件一行。 我可以按每個字母 (a.csv, b.csv, ...) 將 .csv 分成 26 個文件,以加快速度。

  4. Whoosh是一個引起我注意的搜索庫,因為它創建了一次索引。 但是,我不確定它是否完全適用於我的用例,因為它看起來像全文搜索,而且我不能僅限於查找第一列。 如果這個特定的庫不是一個選項,有沒有其他方法可以在 Python 中創建一個可重用的索引來支持這些類型的查找?

我真的很樂於接受各種想法,而且我絕不局限於上述四個選項!

謝謝 :)

類似於方法#2 的東西怎么樣。 您仍然可以將文件讀入內存,但不是將其存儲到列表中並使用二進制搜索來搜索鍵,而是可以將文件存儲到哈希映射中

這樣做的好處是利用哈希映射的平均查找時間O(1)O(n)的最壞情況。 時間復雜度的好處和理由可以在這里這里找到。 由於您只查找鍵,因此具有恆定的查找時間將是搜索文件的好方法。 這種方法也比二分搜索的平均O(log n)搜索時間快。

您可以將文件存儲為

table = {
    key1: (value1, value2),
    key2: (value1, value2),
    key2: (value1, value2)
}

請注意,此方法僅適用於您的所有鍵都不同且沒有重復鍵的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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