Как я могу решить проблему с ошибкой памяти? - PullRequest
0 голосов
/ 21 января 2019

В моей программе недостаточно памяти.С консольным вариантом все в порядке.

Я написал программу для генерирования слов из букв и количества букв в слове.Когда слово имеет длину 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 голосов
/ 21 января 2019

нет необходимости создавать «жесткий» список здесь:

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

Это, вероятно, будетмедленно (но не медленнее, чем раньше), но это одна проблема с памятью (могут быть и другие, поскольку вы, похоже, храните слова в словаре).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...