[python] Python 및 NumPy를 사용하는 매우 큰 행렬

NumPy 는 매우 유용한 라이브러리이며, 그것을 사용함으로써 상당히 큰 (10000 x 10000) 행렬을 쉽게 처리 할 수 ​​있지만 훨씬 더 큰 행렬 (50000 x 50000의 행렬을 만들려고 시도)을 쉽게 처리 할 수 ​​있음을 발견했습니다. 실패). 분명히 이것은 엄청난 메모리 요구 사항 때문입니다.

몇 테라 바이트의 RAM없이 어떤 방식 으로든 NumPy (예 : 1 백만 x 1 백만)에서 기본적으로 거대한 행렬을 만드는 방법이 있습니까?



답변

PyTables와 NumPy가 그 길입니다.

PyTables는 선택적 압축을 사용하여 데이터를 HDF 형식으로 디스크에 저장합니다. 내 데이터 세트는 종종 10 배 압축되어 수천 또는 수억 개의 행을 처리 할 때 편리합니다. 또한 매우 빠릅니다. 5 년된 노트북은 초당 1,000,000 행으로 SQL과 같은 GROUP BY 집계를 수행하는 데이터를 처리 할 수 ​​있습니다. Python 기반 솔루션에는 나쁘지 않습니다!

NumPy 재캐 레이로 데이터에 다시 액세스하는 것은 다음과 같이 간단합니다.

data = table[row_from:row_to]

HDF 라이브러리는 관련 데이터 청크를 읽고 NumPy로 변환합니다.


답변

numpy.arrays는 기억 속에 살기위한 것입니다. RAM보다 큰 행렬로 작업하려면 그 문제를 해결해야합니다. 따를 수있는 방법은 두 가지 이상입니다.

  1. 행렬에 있는 특수 구조를 활용 하는보다 효율적인 행렬 표현시도하십시오 . 예를 들어 다른 사람들이 이미 지적했듯이 희소 행렬 (0이 많은 행렬)에 대한 효율적인 데이터 구조가 scipy.sparse.csc_matrix있습니다.
  2. 알고리즘을 수정하여 부분 행렬에서 작동합니다 . 현재 계산에 사용중인 행렬 블록 만 디스크에서 읽을 수 있습니다. 클러스터에서 실행되도록 설계된 알고리즘은 데이터가 여러 컴퓨터에 분산되어 있고 필요할 때만 전달되기 때문에 일반적으로 블록 단위로 작동합니다. 예를 들어 행렬 곱셈을위한 Fox 알고리즘 (PDF 파일) .


답변

numpy.memmap를 사용하여 디스크의 파일을 메모리 매핑 할 수 있어야합니다. 최신 Python 및 64 비트 시스템에서는 모든 것을 메모리에로드하지 않고도 필요한 주소 공간이 있어야합니다. OS는 파일의 일부만 메모리에 보관해야합니다.


답변

희소 행렬을 처리하려면 scipy맨 위에 있는 패키지가 필요 합니다. 제공 되는 희소 행렬 옵션에 대한 자세한 내용 numpy여기 를 참조 하세요scipy .


답변

스테파노 보리 니의 포스트 를 통해 이런 일이 벌써 얼마나 진행되고 있는지 살펴 보게되었습니다.

이거 야. 기본적으로 원하는 것을하는 것 같습니다. HDF5를 사용하면 매우 큰 데이터 세트를 저장 한 다음 NumPy와 동일한 방식으로 액세스하고 사용할 수 있습니다.


답변

64 비트 운영 체제와 64 비트 버전의 Python / NumPy를 사용하고 있는지 확인합니다. 32 비트 아키텍처에서는 일반적으로 3GB의 메모리를 처리 할 수 ​​있습니다 (메모리 매핑 된 I / O 등으로 인해 약 1GB가 손실 됨).

64 비트 및 사용 가능한 RAM보다 큰 사물 어레이를 사용하면 가상 메모리를 사용할 수 있지만 스왑해야하는 경우 속도가 느려집니다. 또한 메모리 맵 (numpy.memmap 참조)은 대용량 파일을 메모리에로드하지 않고 디스크에서 작업 할 수있는 방법이지만,이를 많이 사용하려면 작업 할 64 비트 주소 공간이 있어야합니다. PyTables도이 대부분을 수행합니다.


답변

약간의 알파이지만 http://blaze.pydata.org/ 는이 문제를 해결하기 위해 노력하고있는 것 같습니다.