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.array
s는 기억 속에 살기위한 것입니다. RAM보다 큰 행렬로 작업하려면 그 문제를 해결해야합니다. 따를 수있는 방법은 두 가지 이상입니다.
- 행렬에 있는 특수 구조를 활용 하는보다 효율적인 행렬 표현 을 시도하십시오 . 예를 들어 다른 사람들이 이미 지적했듯이 희소 행렬 (0이 많은 행렬)에 대한 효율적인 데이터 구조가
scipy.sparse.csc_matrix
있습니다. - 알고리즘을 수정하여 부분 행렬에서 작동합니다 . 현재 계산에 사용중인 행렬 블록 만 디스크에서 읽을 수 있습니다. 클러스터에서 실행되도록 설계된 알고리즘은 데이터가 여러 컴퓨터에 분산되어 있고 필요할 때만 전달되기 때문에 일반적으로 블록 단위로 작동합니다. 예를 들어 행렬 곱셈을위한 Fox 알고리즘 (PDF 파일) .
답변
numpy.memmap를 사용하여 디스크의 파일을 메모리 매핑 할 수 있어야합니다. 최신 Python 및 64 비트 시스템에서는 모든 것을 메모리에로드하지 않고도 필요한 주소 공간이 있어야합니다. OS는 파일의 일부만 메모리에 보관해야합니다.
답변
답변
답변
64 비트 운영 체제와 64 비트 버전의 Python / NumPy를 사용하고 있는지 확인합니다. 32 비트 아키텍처에서는 일반적으로 3GB의 메모리를 처리 할 수 있습니다 (메모리 매핑 된 I / O 등으로 인해 약 1GB가 손실 됨).
64 비트 및 사용 가능한 RAM보다 큰 사물 어레이를 사용하면 가상 메모리를 사용할 수 있지만 스왑해야하는 경우 속도가 느려집니다. 또한 메모리 맵 (numpy.memmap 참조)은 대용량 파일을 메모리에로드하지 않고 디스크에서 작업 할 수있는 방법이지만,이를 많이 사용하려면 작업 할 64 비트 주소 공간이 있어야합니다. PyTables도이 대부분을 수행합니다.