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.array
는 기억 속에 살기위한 것입니다. RAM보다 큰 행렬로 작업하려면 그 문제를 해결해야합니다. 따를 수있는 방법은 두 가지 이상입니다.
- 행렬에 있는 특수 구조를 활용 하는보다 효율적인 행렬 표현 을 시도하십시오 . 예를 들어 다른 사람들이 이미 지적했듯이 희소 행렬 (0이 많은 행렬)에 대한 효율적인 데이터 구조가
scipy.sparse.csc_matrix
있습니다. - 부분 행렬에서 작동하도록 알고리즘을 수정합니다 . 현재 계산에 사용중인 행렬 블록 만 디스크에서 읽을 수 있습니다. 클러스터에서 실행되도록 설계된 알고리즘은 데이터가 여러 컴퓨터에 분산되어 있고 필요할 때만 전달되기 때문에 일반적으로 블록 단위로 작동합니다. 예를 들어 행렬 곱셈을위한 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/ 는이 문제를 해결하기 위해 노력하고있는 것 같습니다.
테라 바이트의 RAM없이 2,500,000,000 요소 행렬을 처리하는 방법을 묻고 있습니까?
80 억 바이트의 RAM없이 20 억 개의 항목을 처리하는 방법은 매트릭스를 메모리에 보관하지 않는 것입니다.
이는 파일 시스템에서 조각을 가져 오는 훨씬 더 정교한 알고리즘을 의미합니다.
때때로 하나의 간단한 솔루션은 행렬 항목에 사용자 지정 유형을 사용하는 것입니다. 필요한 숫자의 범위에 따라 설명서를 사용할 수 dtype
있으며 특히 항목에 대해 더 작습니다. Numpy는 기본적으로 객체에 대해 가장 큰 유형을 고려하기 때문에 이것은 많은 경우에 유용한 아이디어 일 수 있습니다. 다음은 예입니다.
In [70]: a = np.arange(5)
In [71]: a[0].dtype
Out[71]: dtype('int64')
In [72]: a.nbytes
Out[72]: 40
In [73]: a = np.arange(0, 2, 0.5)
In [74]: a[0].dtype
Out[74]: dtype('float64')
In [75]: a.nbytes
Out[75]: 32
그리고 사용자 정의 유형 :
In [80]: a = np.arange(5, dtype=np.int8)
In [81]: a.nbytes
Out[81]: 5
In [76]: a = np.arange(0, 2, 0.5, dtype=np.float16)
In [78]: a.nbytes
Out[78]: 8
일반적으로 큰 행렬을 다룰 때 Sparse Matrices 로 구현합니다 .
NumPy와 지원이 행렬을 스파 스하지만 내가 찾은 모르겠어요 이 대신.
내가 numpy에 대해 아는 한, 아니오, 그러나 내가 틀릴 수 있습니다.
I can propose you this alternative solution: write the matrix on the disk and access it in chunks. I suggest you the HDF5 file format. If you need it transparently, you can reimplement the ndarray interface to paginate your disk-stored matrix into memory. Be careful if you modify the data to sync them back on the disk.
참고URL : https://stackoverflow.com/questions/1053928/very-large-matrices-using-python-and-numpy
'code' 카테고리의 다른 글
배포 nodejs 패키지 (Ubuntu)를 사용하여 홈 디렉터리에 NPM 설치 (0) | 2020.09.23 |
---|---|
섭씨 기호를 웹 페이지로 인코딩하는 가장 좋은 방법은 무엇입니까? (0) | 2020.09.23 |
NSArray에서 임의의 개체 선택 (0) | 2020.09.23 |
소켓 작업에 대한 제한 시간 설정 (0) | 2020.09.23 |
대규모 데이터 처리 Hbase 대 Cassandra (0) | 2020.09.23 |