簡體   English   中英

Python:獲取大文件中所有行的Line指針

[英]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.

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