2016-05-01 64 views
1

我有一個巨大的純文本文件,10億字符串,其中平均字符串長度大約10-12,有潛在的重複,並且每個字符串是在不同的行上。我的任務是,當給定查詢字符串時,如果字符串存在於我的文件中,找到第一個匹配的行,或返回「未找到」。通過一個巨大的短字符串搜索

一個自然的解決方案是每次運行grep -m1 -n '^querystring$',這需要大約15-20秒,並且這不需要額外的存儲並且不佔用內存。這是一個好的解決方案,還是有更好的?

(NB作爲一個粗略的指導,我的存儲要求:< 10GB和內存要求:< 16GB)

回答

0

你可以使用一個簡單的Python代碼:這樣

file = 'file.txt' 
queryLine = 0 
with open(file, 'r') as f: 
    for line in f: 
     if <YOUR QUERY> in line: return queryLine 
     else: queryLine += 1 

,你當找到匹配時打破,而不是使用grep,並且每次都檢查整個文件。

0

下面是一個Python的解決方案:

當你open你會得到一個迭代器讓您一次在一個線,這是非常有效的內存文件。我的建議是枚舉文件,獲取第一行線滿足你的標準是這樣的:

def first_occurrence(filename, query): 
    with open(filename) as f: 
     filtered = (i for i, line in enumerate(f, 1) if query in line) 
     return next(filtered, 'not found') 

如果沒有這樣的行,則返回默認值'not found'filtered = (...)通過使用生成器表達式來構建生成器。生成器是迭代器,所以這部分也是高效的。