![](/img/trans.png)
[英]Efficiently get all lines starting with given string for a large text file
[英]Python: Get Line pointers of all lines in a large file
我有一個大文件(6-60 GB),我無法完全加載到內存中。 我可以逐行閱讀:
with open(...) as f:
for line in f:
# Do something with 'line'
但有時當我讀到第n
行時,我也需要來自第n+2
行的信息。 當我的'line'對象指向第n
行時,如何讀取第n+2
行? 我仍然需要正常處理后一行。
我擔心如果我使用f.readlines(10)
,因為我不知道我的f.readlines(10)
的大小(它可能是99)。
我想到了一種方法,就是在列表中使用seek和tell來為每一行提供行指針,但我又擔心存儲空間。
我正在尋找讀取此文件的速度。 有什么建議?
您對線引用的想法很好,並且在存儲方面非常有效:整數指的是每一行。 但是,跳轉文件並不是特別節省時間。
相反,我建議你有一個預讀緩沖區。 如果你在第n
行並且需要來自第n+2
行的數據,那么請提前讀取這兩行並將它們保存在內存中。 完成處理線n
。 當您准備好接收下一行輸入時,您已經將它放在緩沖區中。
讀優先級是(a)緩沖區; (b)從內存中獲取下一行。
這是否足以讓你進步?
作為Prune答案的必然結果,隊列可以很好地實現預讀緩沖區或后面的監視,兩個隊列保持恆定長度可以提供當前行周圍的良好中間視圖。
基本上讀行,推隊。 當堆棧從隊列和進程中彈出一定大小時,然后按下第二個隊列。
當第二個隊列達到給定大小時,只需彈出它並忘記該行。
無論何時您需要查看當前行,您都可以向前看或僅通過訪問任一隊列中的值來向后看。
所有這些實際上可以通過一個簡單的列表實際完成https://docs.python.org/2/tutorial/datastructures.html
使用列表作為預讀隊列_l.insert(0,line)插入一行_l.pop()來刪除行並處理它
要么
_l.append(line)插入一行_l.pop(0)來刪除該行並對其進行處理
確保列表_l達到所需的大小,然后再調用pop,只有當您需要保留在內存中的行接近您嘗試處理的行時才會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.