![](/img/trans.png)
[英]What is the most efficient way to repeatedly search a large text file (800 MB) for certain numbers?
[英]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')]
,它表示第一個完全匹配的“阿爾法”和“伽馬”。
我一直在閱讀有關我擁有的選項的信息,我真的很喜歡您對以下哪種方法最適合我的用例的意見。
將文件一次讀入有序集合,並執行 200 次左右的查找。 但是,對於每個使用該應用程序的用戶(~100),該文件將被加載到內存中。
將文件讀入一次列表,並使用二分查找(例如bisect )。 與 1.) 類似的問題,對於每個需要進行搜索的用戶,該文件將被加載到內存中。
不要將整個文件讀入內存,而只是一次讀取文件一行。 我可以按每個字母 (a.csv, b.csv, ...) 將 .csv 分成 26 個文件,以加快速度。
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.