微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我正在创建一个 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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。