developer tip

메모리 오류 및 목록 제한?

optionbox 2020. 11. 21. 14:12
반응형

메모리 오류 및 목록 제한?


과학적 목적으로 크고 큰 (매우) 행렬 (Markov 체인)을 생성해야합니다. 저는 20301 개의 요소 목록 (= 행렬의 한 행)에 넣은 미적분을 수행합니다. 다음 Markov 단계를 진행하려면 모든 데이터를 메모리에 저장해야하지만 필요한 경우 Markov 체인 워크 스루 속도가 느려지더라도 다른 곳에 저장할 수 있습니다 (예 : 파일). 내 컴퓨터 (과학 실험실) : Bi-xenon 6 코어 / 각 12 스레드, 12GB 메모리, OS : win64

  Traceback (most recent call last):
  File "my_file.py", line 247, in <module>
    ListTemp.append(calculus)
MemoryError

미적분 결과의 예 : 9.233747520008198e-102 (예, 1/9000 이상)

19766 번째 요소를 저장할 때 오류가 발생합니다.

ListTemp[19766]
1.4509421012263216e-103

더 가면

Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    ListTemp[19767]
IndexError: list index out of range

따라서이 목록에는 19767 루프에서 메모리 오류가 있습니다.

질문 :

  1. 목록에 대한 메모리 제한이 있습니까? "목록 별 제한"또는 "스크립트 당 전역 제한"입니까?

  2. 이러한 제한을 우회하는 방법은 무엇입니까? 마음에있는 가능성이 있습니까?

  3. numpy, python64를 사용하는 것이 도움이 될까요? 그들과의 메모리 한계는 무엇입니까? 다른 언어는 어떻습니까?


먼저 Python 배열이 얼마나 커질 수 있습니까?를 참조 하십시오. Numpy, 긴 배열 문제

둘째, 유일한 실제 한계는 보유한 메모리 양과 시스템이 메모리 참조를 저장하는 방법에서 비롯됩니다. 목록 당 제한이 없으므로 Python은 메모리가 부족할 때까지 이동합니다. 두 가지 가능성 :

  1. 이전 OS 또는 프로세스가 제한된 양의 메모리를 사용하도록 강제하는 OS에서 실행중인 경우 Python 프로세스가 액세스 할 수있는 메모리 양을 늘려야 할 수 있습니다.
  2. 청킹을 사용하여 목록을 분리하십시오. 예를 들어, 목록의 처음 1000 개 요소를 피클하고 디스크에 저장 한 다음 다음 1000 개를 수행합니다. 이러한 요소를 사용하려면 한 번에 한 청크를 해제하여 메모리가 부족하지 않도록합니다. 이것은 본질적으로 데이터베이스가 RAM에 맞는 것보다 더 많은 데이터로 작업하는 데 사용하는 것과 동일한 기술입니다.

표시되는 MemoryError예외는 사용 가능한 RAM이 부족한 직접적인 결과입니다. 이는 Windows ( 32 비트 프로그램 )에서 지정한 프로그램 당 2GB 제한 또는 컴퓨터에 사용 가능한 RAM이 부족하기 때문에 발생할 수 있습니다 . (이 링크 는 이전 질문에 대한 것입니다).

64 비트 Windows 사본을 사용하는 경우 64 비트 Python 사본을 사용하여 2GB를 확장 할 수 있어야합니다.

IndexError파이썬이 충돌 때문에 발생하는 것입니다 MemoryError전체 배열을 계산하기 전에 예외를. 다시 말하지만 이것은 메모리 문제입니다.

이 문제를 해결하려면 64 비트 Python 사본을 사용하거나 파일에 결과를 쓰는 방법을 찾는 것이 좋습니다. 이를 위해 numpy의 메모리 매핑 배열을 살펴보십시오 .

실제 데이터는 디스크에 기록되고 일부만 메모리에 저장되므로 전체 계산 세트를 이러한 어레이 중 하나로 실행할 수 있어야합니다.


Python에 의해 부과 된 메모리 제한은 없습니다. 그러나 MemoryErrorRAM이 부족 하면 오류가 발생합니다. 당신은 당신이 list. 간단한 데이터 유형 (예 :)에 대해 메모리 오류를 발생 시키기에는 너무 작아 보이지만 int각 요소 자체가 많은 메모리를 차지하는 객체 인 경우 메모리가 부족할 수 있습니다.

IndexError그러나 당신이 있기 때문에 아마 발생 ListTemp에만 19,767 요소를 가지고 (19,766 0 색인)있다, 당신은 마지막 요소 과거 액세스하려는.

당신이하려는 것이 무엇인지 정확히 알지 못한 채 한계에 도달하지 않기 위해 무엇을 할 수 있는지 말하기는 어렵습니다. 사용하면 numpy도움이 될 수 있습니다. 엄청난 양의 데이터를 저장하고있는 것 같습니다. 모든 단계에서 모든 것을 저장할 필요가 없을 수도 있습니다. 그러나 모르고 말하는 것은 불가능합니다.


이 문제를 피하려면 선반을 사용할 수도 있습니다. 그런 다음 처리 할 컴퓨터 용량 크기의 파일을 만들고 필요한 경우에만 RAM에 저장합니다. 기본적으로 HD에 기록하고 정보를 다시 조각으로 가져 와서 처리 할 수 ​​있습니다.

바이너리 파일을 만들고 정보가 이미 있는지 확인하십시오. 그렇다면 로컬 변수를 만들어 필요하다고 생각하는 데이터를 작성하십시오.

Data = shelve.open('File01')
   for i in range(0,100):
     Matrix_Shelve = 'Matrix' + str(i)
     if Matrix_Shelve in Data:
        Matrix_local = Data[Matrix_Shelve]
     else:
        Data[Matrix_Selve] = 'somenthingforlater'

너무 비현실적으로 들리지 않기를 바랍니다.

참고URL : https://stackoverflow.com/questions/5537618/memory-errors-and-list-limits

반응형