保持文件永久打开的风险

时间:2016-09-16 17:14:30

标签: python memory io

我正在编写一个应用程序,需要每5分钟从1GB文件中读取下一行;当到达结束时,它应该从顶部开始

我有两个解决方案,但我不确定哪一个是最好的

解决方案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

2 个答案:

答案 0 :(得分:2)

使用解决方案1,但每次打开文件时都不要逐行阅读。保存最后一个偏移读数,并直接保存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

答案 1 :(得分:2)

一般来说,从文件中读取 lazily 的最大风险是在您阅读文件时写入文件的另一个过程。

文件内容是否有变化?文件庞大吗?如果没有,只需在启动时读取整个文件。

文件是否会发生很大变化?还有很多其他流程写入它吗?其他进程可以删除行吗?如果是这种情况,您应该只存储seek /行号位置,然后每5分钟重新打开并关闭文件,检查您是否在文件末尾并继续阅读。在这种情况下,您还应该使用某种类型的锁定文件或其他同步机制来防止多个进程同时尝试从同一个文件读取和写入。