问题描述
感谢您抽出时间看这个问题!
我正在创建一个 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
这样您就不会一次将整个文档重新加载到内存中。