>source

그래서 저는 완전히 윤리적 인 목적을 위해 재귀 적으로 무거운 코드를 만들려고 노력해 왔고 파이썬 쉘이 약 30 초 후에 다시 시작된다는 것을 알았습니다.

처음에는 메모리 누수로 인한 스택 오버플로라고 생각했기 때문에 적절하게 처리했습니다. 여전히 운이 없습니다. 그런 다음 tracemalloc을 사용하여 메모리 사용량을 확인하고 다시 시작하기 전에 약 1.3MB에 불과하다는 것을 알았습니다. 나는 다른 최종 메모리 크기를 제공하지만 여전히 다시 시작하는 메모리 누수를 막기 위해 여러 가지 방법을 시도했습니다.

이것은 사용 된 총 메모리 양에 관계없이 4788 줄을 인쇄 한 후 매번 다시 시작되는 것을 알았습니다.

파이썬이 인쇄 할 수있는 줄 수에 제한이 있습니까? Pls 도움!

import random
import sys
import gc
import tracemalloc
tracemalloc.start()
def cleartrash():
    #gc.collect()
##    del genphrase
    print('clearedddddddddddddddddddddddddd')
sys.setrecursionlimit(99999999)
capitalsandlowers = ('qwertyuiopasdfghjklzxcvbnm')
print ('monkey experiment')
def generatephrase():
    generatedlength = random.randint(5,5)
    genphrase = ( ''.join(random.choice(capitalsandlowers) for i in range(generatedlength)) )
    
    print(genphrase)
    
    if genphrase == 'henry':
        print('done',genphrase)
    else:
        current, peak = tracemalloc.get_traced_memory()
        print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
        #cleartrash()
        del genphrase
        del generatedlength
        #gc.collect()
        generatephrase()
generatephrase()
tracemalloc.stop()

전체 코드를 포함해야해서 미안하지만 문제가있는 곳이나 수정 방법에 대한 단서가 없습니다.

미리 감사드립니다!

  • 답변 # 1

    문제 자체가 재귀 적이 지 않기 때문에 이것은 유효한 재귀 사용이 아닙니다. 코드를 반복적으로 변경하면 고정 된 양의 메모리에서 무기한으로 실행됩니다.

    from random import randint, choices
    from string import ascii_lowercase as capitalsandlowers
    print("Monkey Experiment")
    def generatephrase():
        while True:
            generatedlength = randint(5, 5)
            genphrase = ''.join(choices(capitalsandlowers, k=generatedlength))
            print(genphrase)
            if genphrase == 'henry':
                print("Done:", genphrase)
                break
    generatephrase()
    
    

    테스트 실행에서 4 분 만에 대상 문구를 찾았습니다.

    Done: henry
    193.963u 28.280s 3:53.61 95.1%  0+0k 0+0io 0pf+0w
    
    

    9,356,241 개의 임의 문자열을 테스트했습니다.

  • 답변 # 2

    나는 여행 한 이후로 WiFi를 가지고 있지 않았지만 비행기에서 놀면서 대신 while 루프를 사용하여 똑같은 것을 만들었고 완벽하게 작동했습니다! 나는 아직도 당신이 어떻게 작동했는지 잘 모르겠고 내 원본은 그렇지 않았으므로 곧 마음을 자세히 살펴 보겠습니다. 모든 도움에 감사드립니다!

관련 자료

  • 이전 sql - grafana의 클릭 하우스에서 필터링 된 결과 플로팅이 작동하지 않습니다
  • 다음 reactjs에서 img 태그의 오류를 처리하는 방법