복붙노트

[PYTHON] 파이썬과 numpy로 큰 데이터로 작업하는 것, 램이 충분하지 않은 것, 부분 결과를 디스크에 저장하는 방법?

PYTHON

파이썬과 numpy로 큰 데이터로 작업하는 것, 램이 충분하지 않은 것, 부분 결과를 디스크에 저장하는 방법?

파이썬에서 200k + datapoints를 가진 1000 차원 데이터를위한 알고리즘을 구현하려고합니다. 나는 numpy, scipy, sklearn, networkx 및 다른 유용한 라이브러리를 사용하고 싶다. 모든 점 사이의 쌍 거리와 같은 연산을 수행하고 모든 점에 대해 클러스터링을 수행하려고합니다. 합리적인 복잡성으로 원하는 작업을 수행하는 작업 알고리즘을 구현했지만 모든 데이터를 크기 조정하려고 시도 할 때 RAM이 부족합니다. 물론 200k + 데이터에서 pairwise distance에 대한 행렬을 만드는 것은 많은 메모리를 필요로합니다.

캐치가 생깁니다. 저도 컴퓨터가 너무 작고 양이 적은 컴퓨터에서이 작업을 수행하고 싶습니다.

낮은 숫양의 제약없이이 작업을 할 수있는 가능한 방법이 있습니까? time reqs가 무한대로 가지 않는 한 그것은 훨씬 더 오래 걸릴 것입니다.

내 알고리즘을 작동시키고 다시 1 시간에서 5 시간 후에 다시 돌아올 수 있고 RAM이 없어 졌기 때문에 멈추지 않을 수 있기를 원합니다! 나는 이것을 파이썬으로 구현하고 싶다. numpy, scipy, sklearn, networkx 라이브러리를 사용할 수 있어야한다. 내 모든 포인트 등 pairwise 거리를 계산할 수있게하고 싶습니다.

이것이 가능한가? 그리고 나는 그것에 대해 어떻게 갈 것인가? 내가 읽을 수있는 것은 무엇인가?

친애하는 // Mesmer

해결법

  1. ==============================

    1.numpy.memmap을 사용하면 파일에 직접 매핑 된 배열을 만들 수 있습니다.

    numpy.memmap을 사용하면 파일에 직접 매핑 된 배열을 만들 수 있습니다.

    import numpy
    a = numpy.memmap('test.mymemmap', dtype='float32', mode='w+', shape=(200000,1000))
    # here you will see a 762MB file created in your working directory    
    

    기존 배열로 처리 할 수 ​​있습니다.     a + = 1000.

    동일한 파일에 더 많은 배열을 할당하여 필요할 경우 상호 소스에서 제어 할 수도 있습니다. 하지만 여기서 약간의 까다로운 일들을 경험했습니다. 전체 배열을 열려면 먼저 del을 사용하여 이전 배열을 "닫아야"합니다.

    del a    
    b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000))
    

    그러나 배열의 일부만 개방하면 동시 제어를 수행 할 수 있습니다.

    b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000))
    b[1,5] = 123456.
    print a[1,5]
    #123456.0
    

    큰! a가 b와 함께 변경되었습니다. 그리고 변경 사항은 이미 디스크에 기록되어 있습니다.

    논평 할 가치가있는 또 다른 중요한 것은 상쇄이다. b에서 처음 2 줄을 사용하지 않고 150000과 150001 줄을 사용한다고 가정하십시오.

    b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000),
                     offset=150000*1000*32/8)
    b[1,2] = 999999.
    print a[150001,2]
    #999999.0
    

    이제 동시 작업에서 어레이의 모든 부분에 액세스하고 업데이트 할 수 있습니다. 오프셋 계산에 들어가는 바이트 크기에 주목하십시오. 따라서 'float64'의 경우이 예제는 150000 * 1000 * 64 / 8이됩니다.

    기타 참고 문헌 :

  2. ==============================

    2.OS에서 가상 메모리를 늘리고 64 비트 Python을 사용하면 64 비트 OS를 제공 할 수 있습니다.

    OS에서 가상 메모리를 늘리고 64 비트 Python을 사용하면 64 비트 OS를 제공 할 수 있습니다.

  3. from https://stackoverflow.com/questions/16149803/working-with-big-data-in-python-and-numpy-not-enough-ram-how-to-save-partial-r by cc-by-sa and MIT license