如何解决内存错误问题?

时间:2019-01-21 13:21:03

标签: python python-3.x multithreading tkinter

我的程序内存不足。控制台版本很好。

我编写了一个程序,用于从字母和单词中的字母数量生成单词。当单词的长度为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()

我该如何解决这个问题?

1 个答案:

答案 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()))):

这可能会很慢(但不会比以前慢),但这是一个内存问题(可能还有其他问题,因为您似乎将单词存储在字典中)。