天天看點

python 中間檔案 傳值_在Python中尋找檔案的中間

我正在編寫一個程式來搜尋非常大(無序)檔案中的特定行(是以最好不要将整個檔案加載到記憶體中).

我正在實作多線程以加快該過程.我正在嘗試為特定線程提供檔案的特定部分,即第一個線程将運作到檔案的第一季度,第二個線程從第一個線程停止的端點掃描(同時),以此類推.

是以,要做到這一點,我需要找到檔案不同部分的位元組位置,以簡化問題,可以說我隻想找到檔案的中間位置.但問題是每行的長度都不同,是以如果我這樣做

fo.seek(0, 2)

end = fo.tell()

mid = end/2

fo.seek(mid, 0)

它可以使我處于中間位置.是以,我需要一種尋找下一個或上一個換行符的方法.另外,請注意,我不希望确切的中間位置位于中間(因為它的檔案很大).

這是我能夠編寫的代碼,我不确定這是否會将檔案加載到記憶體中.而且我真的很想避免打開同一檔案的2個執行個體(我在程式中這樣做是因為我不想擔心讀取檔案時偏移量的變化).

任何更快的修改(或新程式)将不勝感激.

fo = open(filename, "rw+")

f2 = open(filename, "rw+")

file_ = dict()

fo.seek(0, 2)

file_['end'] = fo.tell()

file_['mid'] = file_['end'] / 2

fo.seek(file_['mid'], 0)

f2.seek(file_['mid'], 0)

line = f2.readline()

fo.seek(f2.tell(), 0)

file_['mid'] = f2.tell()

fo.seek(file_['mid'], 0)

print fo.readline()

解決方法:

多大才大?即使是1-10GB的檔案,grep也會相對快速地流淚.

如果檔案是靜态檔案,并且您打算重複搜尋它,則可以拆分它:

split -l

現在您有了多個檔案,并且可以将每個檔案傳遞到單獨的線程/程序/任何檔案.

檔案已排序嗎?因為現在您可以使用fo.seek()調用進行二進制搜尋,是以這再次改變了事情.

多快才足夠快?超過某個點,您将必須建立搜尋索引.到那時,簡單的工具(例如grep,split等)就産生了奇迹.

沒有更多資訊,就無法說出正确的權衡.

标簽:file-handling,search,python