长期运行这个循环会阻塞我的记忆吗?

问题描述

感谢您抽出时间看这个问题!

我正在创建一个 Python 脚本以在 RaspBerry Pi Zero 上运行。这个想法是它会在附加屏幕上无限循环地一次一行滚动很长的文本(指环王三部曲)。

我已经使用以下代码和示例文本进行了循环。然而,我对 Python 使用内存的方式并不十分熟悉。随着每一行的生成和打印,这种方法是否会继续占用越来越多的内存(或者,换句话说,这最终会冻结)?

import time
import tkinter as tk

book = open('ave.txt','r')
lines = book.readlines()

position = 0

class Example(tk.Frame):
    def __init__(self,*args,**kwargs):
        tk.Frame.__init__(self,**kwargs)

        self.text = tk.Text(self,height=6,width=40)
        self.text.pack(side="left",fill="both",expand=True)
        
        self.readbook()

    def readbook(self):
        global position
        self.text.insert("end",lines[position])
        self.text.see("end")
        position += 1
        self.after(1000,self.checkloop)

    def checkloop(self):
        global position
        if position == 6:
            position = 0
            self.text.insert("end",'\n' + '\n')
            self.readbook()
        else:
            self.readbook()

if __name__ == "__main__":
    root =tk.Tk()
    frame = Example(root)
    frame.pack(fill="both",expand=True)
    root.mainloop()

(感谢 Bryan Oakley,他为该实现提供了框架,并在 https://stackoverflow.com/a/30671211/15277790 上给出了答案)

解决方法

这里有很多复杂的问题没有解决。假设你有 512mb 我不这么认为。您的汇总文档的大小是多少? readlines() 的文档说明它将整个文档加载到内存中(它已经在内存中打开,因此是一个副本),将每一行解析为一个字符串,并将它们存储在一个数组中。如果整个文档像 25mb 一样,你应该很好。你总是可以使用像

这样的东西来遍历这些行
with open('lor.txt') as f:
    while True:
        line = f.readline()
        if not line:
            break
        pass

这样您就不会一次将整个文档重新加载到内存中。