Подтвердить что ты не робот

Ошибка памяти в python

Traceback (most recent call last):
File "/run-1341144766-1067082874/solution.py", line 27, in 
main()
File "/run-1341144766-1067082874/solution.py", line 11, in main
if len(s[i:j+1]) > 0:
MemoryError
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 64, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in 
from apport.report import Report
MemoryError

Original exception was:
Traceback (most recent call last):
File "/run-1341144766-1067082874/solution.py", line 27, in 
main()
File "/run-1341144766-1067082874/solution.py", line 11, in main
if len(s[i:j+1]) > 0:
MemoryError

Вышеприведенные ошибки появились, когда я попытался запустить следующую программу. Может кто-нибудь объяснить, что такое ошибка памяти, и как решить эту проблему?, Программа принимает строки как входные данные и находит все возможные подстроки и создает из нее набор (в лексикографическом порядке), и он должен печатать значение в соответствующем индексе, заданном пользователем, иначе он должен печатать "Недействительный"

def main():
    no_str = int(raw_input())
    sub_strings= []
    for k in xrange(0,no_str):
        s = raw_input()
        a=len(s)
        for i in xrange(0, a):
            for j in xrange(0, a):
                if j >= i:
                    if len(s[i:j+1]) > 0:
                        sub_strings.append(s[i:j+1])
    sub_strings = list(set(sub_strings))
    sub_strings.sort()
    queries= int(raw_input())
    resul = []
    for i in xrange(0,queries):
        resul.append(int(raw_input()))
    for p in resul:
        try:
            print sub_strings[p-1]
        except IndexError:
            print 'INVALID'


if __name__ == "__main__":
   main()
4b9b3361

Ответ 1

Это здесь:

s = raw_input()
a=len(s)
for i in xrange(0, a):
    for j in xrange(0, a):
        if j >= i:
            if len(s[i:j+1]) > 0:
                sub_strings.append(s[i:j+1])

кажется очень неэффективным и дорогостоящим для больших строк.

Лучше сделать

for i in xrange(0, a):
    for j in xrange(i, a): # ensures that j >= i, no test required
        part = buffer(s, i, j+1-i) # don't duplicate data
        if len(part) > 0:
            sub_Strings.append(part)

Объект-буфер сохраняет ссылку на исходную строку и атрибуты начала и длины. Таким образом, не происходит ненужного дублирования данных.

Строка длины l имеет подстроки l*l/2 средней длины l/2, поэтому потребление памяти будет примерно равным l*l*l/4. С буфером он намного меньше.

Обратите внимание, что buffer() существует только в 2.x. 3.x имеет memoryview(), который используется несколько иначе.

Еще лучше было бы вычислить индексы и вырезать подстроку по запросу.

Ответ 2

Если вы получаете неожиданный MemoryError и думаете, что у вас должно быть достаточно ОЗУ, возможно, это связано с тем, что вы используете 32-разрядную установку python.

Простое решение, если у вас 64-разрядная операционная система, заключается в переключении на 64-разрядную установку python.

Проблема заключается в том, что 32-разрядный питон имеет доступ только к ~ 4 ГБ ОЗУ. Это может сократиться еще больше, если ваша операционная система 32-разрядная, из-за накладных расходов операционной системы.

Вы можете узнать больше о том, почему 32-битные операционные системы ограничены ~ 4 ГБ ОЗУ здесь: https://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-is-limited-to-4gb-of-ram

Ответ 3

A ошибка памяти означает, что в вашей программе закончилась нехватка памяти. Это означает, что ваша программа каким-то образом создает слишком много объектов.

В вашем примере вам нужно искать части вашего алгоритма, которые могут потреблять много памяти. Я подозреваю, что ваша программа получает очень длинные строки в качестве входных данных. Поэтому s[i:j+1] может быть виновником, так как он создает новый список. В первый раз, когда вы его используете, это не обязательно, потому что вы не используете созданный список. Вы можете попытаться выяснить, помогает ли следующее:

if  j + 1 < a:
    sub_strings.append(s[i:j+1])

Чтобы заменить второе создание списка, вы обязательно должны использовать объект buffer, как это было предложено glglgl.

Также обратите внимание, что, поскольку вы используете if j >= i:, вам не нужно запускать xrange в 0. Вы можете:

for i in xrange(0, a):
    for j in xrange(i, a):
        # No need for if j >= i

Более радикальной альтернативой было бы попытаться переработать ваш алгоритм, чтобы вы не предварительно вычислили все возможные подстроки. Вместо этого вы можете просто вычислить запрошенную подстроку.

Ответ 4

вы можете попытаться создать тот же самый script, который выдает эту ошибку, деля

Ответ 5

Я использую 64-битную систему 8 ГБ оперативной памяти и потому, что я написал

X = np.zeros((639642, 50, 159))

Я получаю ошибку памяти, и мой Python 3.6 является 64-битной версией. Пожалуйста помоги

Ответ 6

Использование python 64 бит решает много проблем.