2016-09-16 60 views
1

我正在寫一個應用程序,需要每隔5分鐘從1GB文件中讀取下一行;當達到到底應該從頂部保持文件永遠打開的風險

開始我想到2個解決方案,但我不能確定哪一個是最好的

解決方案1 ​​

class I: 
    def __init__(self): 
     self.count = 0 

    def lineFromFile(self) -> str: 
     with open('file.txt') as file: 
      for i in range(self.count): 
       file.readline() 
      line = file.readline() 
      if not line: 
       file.seek(0) 
       self.count = 0 
      line = file.readline() 
      self.count += 1 
     return line 

解決方案2

class I: 
    def __init__(self): 
     self.file = open('file.txt') 

    def lineFromFile(self) -> str: 
     line = self.file.readline() 
     if not line: 
      self.file.seek(0) 
      line = self.file.readline() 
     return line 
+0

爲什麼不關閉並重新打開文件,每隔5分鐘跟蹤最後一行讀取而不是捆綁資源? –

+0

這是解決方案1,但關閉/重新打開文件並將alllll向下滾動到特定行似乎不是最佳解決方案 –

回答

2

使用解決方案1,但不要在每次打開fil時逐行閱讀即直接保存上次偏移量讀取,並保存在seek處。另外,如果第一次調用返回空字符串,則只需要再次呼叫file.readline()

class I: 
    def __init__(self): 
     self.count = 0 
     self.offset = 0 

    def lineFromFile(self) -> str: 
     with open('file.txt') as file: 
      file.seek(self.offset) 
      line = file.readline() 
      if not line: 
       file.seek(0) 
       self.count = 0 
      else: 
       line = file.readline() 
      self.count += 1 
      self.offset = file.tell() 
     return line 
+0

不妨將count變量作爲offset來替代它的使用。 – thepieterdc

+0

我對於是否在課程的其他地方使用'self.count'表示不確定。 – chepner

+0

我假設,因爲解決方案2沒有計數變量。 – thepieterdc

2

一般來說,懶洋洋地最大的風險從文件中讀取是另一個進程寫入文件,而你從中讀取。

文件的內容是否改變?文件很大嗎?如果沒有,只需在啓動時閱讀整個文件。

文件是否改變很多?還有很多其他進程正在寫入嗎?其他進程是否可以刪除行?如果是這種情況,您應該只需存儲您的seek /行號位置,然後每5分鐘重新打開並關閉文件,檢查您是否在文件末尾並繼續閱讀。在這種情況下,您還應該使用某種類型的鎖文件或其他同步機制來防止多個進程嘗試同時讀取和寫入同一文件。

+0

在range(n):readline()中查找速度比我快嗎? –

+0

如果你想要到達文件中的特定位置,那麼是的,'seek'會更快,因爲你實際上並不需要讀取任何數據。如果你真的想要每一行,並且你會閱讀它,只需使用'readline' –