我的程序内存不足。控制台版本很好。
我编写了一个程序,用于从字母和单词中的字母数量生成单词。当单词的长度为6个字母或更少时,一切都很好,但是当我使用7个或更多符号时,会出现内存错误。
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import askyesno
from os import popen
import nltk
import itertools
from collections import defaultdict
import threading
class Main_Window(object):
def __init__(self):
super().__init__()
self.window_width = 640
self.window_hight = 480
def Close(*args):
for i in args:
i.destroy()
def Ask_To_Destroy():
if askyesno('Closing Program', 'Are you sure you want to close the program?'):
Close(self.root)
def center(win):
win.update_idletasks()
width = win.winfo_width()
height = win.winfo_height()
x = (win.winfo_screenwidth() // 2) - (width // 2)
y = (win.winfo_screenheight() // 2) - (height // 2)
win.geometry('{}x{}+{}+{}'.format(width, height, x, y))
def dictionary(inpt):
result = defaultdict(list)
for word in inpt:
result[word[:5]].append(word)
return result
def thread_call():
t=threading.Thread(target=search)
t.start()
def search():
if self.symbols.get().isalpha() and self.number_of_symbols.get().isdecimal():
self.output_widget.config(state='normal')
self.output_widget.delete('1.0','end')
for i in [''.join(i) for i in itertools.permutations(list(self.symbols.get().lower()), int(self.number_of_symbols.get()))]:
if i in self.words[i[:5]]:
self.output_widget.insert('end',i+'\n')
self.output_widget.config(state='disabled')
self.root = tk.Tk()
self.root.protocol("WM_DELETE_WINDOW", Ask_To_Destroy)
self.root.title('Word Generator')
self.root.minsize(self.window_width, self.window_hight)
self.words=dictionary([i.lower() for i in nltk.corpus.brown.words()])
self.symbols = tk.StringVar()
self.number_of_symbols = tk.StringVar()
self.main_frame = ttk.Frame(self.root)
self.main_frame.pack(fill='both', expand=True)
self.enter_symols_frame = ttk.Frame(self.main_frame)
self.enter_symols_frame.pack(fill='both', expand=True)
self.symbols_label = ttk.Label(self.enter_symols_frame,text='Enter symbols: ')
self.symbols_label.pack(side='left')
self.symbols_entry = ttk.Entry(self.enter_symols_frame,textvariable=self.symbols)
self.symbols_entry.pack(side='left',fill='x', expand=True)
self.enter_number_of_symbols_frame = ttk.Frame(self.main_frame)
self.enter_number_of_symbols_frame.pack(fill='both', expand=True)
self.number_of_symbols_label = ttk.Label(self.enter_number_of_symbols_frame,text='Enter symbols: ')
self.number_of_symbols_label.pack(side='left')
self.number_of_symbols_entry = ttk.Entry(self.enter_number_of_symbols_frame,textvariable=self.number_of_symbols)
self.number_of_symbols_entry.pack(side='left',fill='x', expand=True)
self.search_button = ttk.Button(self.main_frame,text='Search',command=thread_call)
self.search_button.pack()
self.output_widget = tk.Text(self.main_frame, state = 'disabled')
self.output_widget.pack(fill='both', expand=True)
center(self.root)
self.root.mainloop()
Main_Window()
我该如何解决这个问题?
答案 0 :(得分:1)
无需在此处生成“硬”列表:
for i in [''.join(i) for i in itertools.permutations(list(self.symbols.get().lower()), int(self.number_of_symbols.get()))]:
仅对生成器理解进行迭代,您将节省尽可能多的内存:
for i in (''.join(i) for i in itertools.permutations(list(self.symbols.get().lower()), int(self.number_of_symbols.get()))):
这可能会很慢(但不会比以前慢),但这是一个内存问题(可能还有其他问题,因为您似乎将单词存储在字典中)。