2013-06-13 2 views
2

현재 특정 배열 (다이 그래프) 내의 모든 사이클을 나열하는 함수로 작업 중이며 모두 필요합니다. 이 함수는 모든 사이클을리스트리스트로 반환합니다 (각 서브리스트는 사이클입니다, 예 : result = [[0,1,0], [0,1,2,0]]은 노드에서 시작하고 끝나는 2 사이클을 포함하는리스트입니다) 0). 그러나, 큰 사이클 그래프가 들어 있기 때문에 모든 사이클을 포함하는리스트의 목록이 너무 크기 때문에 메모리 오류 (MemoryError : MemoryError())가 발생합니다.파이썬 : 메모리 오류를 피하기 위해 함수에서리스트를 분리하고 리턴하는 방법

메모리 오류가 발생하지 않도록 함수가 여러 배열로 결과를 분할하고 싶습니다. 그게 가능하니? 문제를 해결할 수 있을까요?

결과 배열을 하위 결과 목록으로 분할하여이를 수행하려고했습니다. 하위 결과는 최대 크기입니다 (예 : 에 표시된 최대 5 억 개 이하의 최대 크기가 1,000 만 개). 아이디어는 결과가 하위 결과를 포함하는 목록이라는 것입니다. 결과 = [하위 결과 1, 하위 결과 2]. 그러나 다른 메모리 오류가 발생합니다. 새 파서에 대한 mem이 없습니다.

if SplitResult == False: 
    result = [] # list to accumulate the circuits found 
    # append cycles to the result list 
    if cycle_found(): #cycle_found() just for example 
     result.append(new_cycle) 
elif SplitResult == True: 
    result = [[]] # list of lists to accumulate the circuits found 
    # append cycles to the LAST result SUB-lists 
    if cycle_found(): #cycle_found() just for example 
     result[len(result)-1].append(new_cycle) 
    # create a new sublist when the size of the LAST result SUB-lists 
    # reaches the size limit (ResultSize)  
    if len(result[len(result)-1]) == ResultSize: 
     result.append([]) 

어쩌면 문제가 나는 결과 목록 내의 모든 하위 결과를 병합한다는 것입니다 다음과 같이

내가 그렇게하는 방법입니다. 이 경우 함수에서 다양한 수의 결과를 반환 할 수 있습니까?

특히, 12 노드 노드의 완전한주기를 1000 만 사이클의 하위 목록으로 나눕니다. 총 115,443,382 사이클이 있다는 것을 압니다. 따라서 16 개의 서브리스트를 가진 목록을 얻어야합니다. 처음 15 개는 각각 1 천만 사이클을 포함하고 마지막 하나는 443,382 사이클을 포함합니다. 대신에 새로운 메모리 오류가 발생합니다 : 새로운 파서에 대한 mem이 없습니다. 이 절차는이 개 하위 목록, 제 1 수 10 만회 (10000000) 그것은 어떤 도움이다 경우 976184.를 포함하는 기타를 반환하는 11 노드 완벽한 소리를 나타내는 두 글자 작동

는 자신의 메모리 풋 프린트는

>>> sys.getsizeof(cycles_list[0]) 
40764028 
>>> sys.getsizeof(cycles_list[1]) 
4348732 
입니다 읽기, 어떤 도움이 가장 환영받을 것입니다

>>> sys.getsizeof(cycles_list[0][4]) 
56 
>>> cycles_list[0][4] 
[0, 1, 2, 3, 4, 0] 

,

감사 :

그런 다음, 우리가 나열된 각주기의 크기를 추가해야합니다 생각

알렉스

+0

당신이 필요합니까 * 한 번에 가능한 사이클의 모든 *? – Blender

+0

그래, 대신 발전기 기능을 사용할 수 있습니까? –

+0

나는 지금 당장 모른다. 나는 발전기 기능이 무엇인지 배우게 될 것이다 (나는 프로그래머가 아니다). 당신에게 다시 돌아온다. – Aleix

답변

2

귀하의 제안에 감사드립니다. 실제로 배열을 반환 할 때 메모리 문제를 피하는 올바른 방법은 단순히 큰 결과 배열을 만드는 것을 피하는 것입니다. 따라서 발전기 기능은 앞으로 나아갈 길입니다.

발전기 기능은 여기에서 잘 설명됩니다. What does the "yield" keyword do in Python? 정상적인 기능은 수확 기능을 추가 한 바로 그 순간에 일반 기능이 발전 기능이된다는 것을 추가합니다. 또한 return 문을 추가하면 iterables의 생성이 도달 할 때 종료됩니다 (일부 생성자 함수에는 "return"이 없으므로 무한합니다).

간단한 생성기 사용에도 불구하고 원래 함수를 생성 함수로 변환하는 것은 힘들었습니다 (즉, 자체 호출). 그러나이 항목은 재귀 생성기 함수가 Help understanding how this recursive python function works?처럼 보이는 방법을 보여 주므로이 함수를 제 함수에 적용 할 수 있습니다.

다시 말하지만, 당신의 지원에 대한 모든 덕분에,

Aleix

+0

+1 정말 좋은 자기 대답. – morningstar

관련 문제