2010-04-14 5 views
0

이전에 matlab에서 시도했기 때문에 매우 큰 데이터 세트를 파이썬을 사용하여 인접 행렬을 계산하려는 거의 450000 라인과 두 행으로 설정했습니다. 메모리가 표시됩니다. 큰 데이터 값 때문에 오류가 발생했습니다. 내 데이터 값도 100에서 시작하여 450000까지 올라갑니다.파이썬을 사용하여 인접성 매트릭스를 만들고 싶습니다.

저는 파이썬을 처음 접하기 때문에 누구나이 문제에 도움이 될 수 있습니다.

은 내가 먼저 엑셀 시트 또는 메모장을 사용하여 파이썬으로 파일을 가져 와서 내가 제대로 질문을 이해 한 다음 RAM에서 사용할 수있는 것보다 더 많은 메모리를 필요로하는 경우 다음 인접 행렬을

+4

"450000 개 라인과 두 행"b를 연결 돌아갑니다? – bakkal

+1

쌍 ("두 행"가능성이 있지만 열을 의미) 가장자리 설명 및 가장자리 목록에서 인접성 매트릭스를 생성할까요? 그래프에 몇 개의 실제 꼭지점이 있습니까?450,000 개의 정점이 있다면 2 천억 개가 넘는 셀이있는 행렬에 대해 이야기하고 있습니다! –

+0

@Andreas 450k 버텍스가있는 인접성 행렬은 double을 사용하여 1.5TB에 가깝게 차지합니다. 가장자리 당 하나의 비트를 사용하는 것이 더 효율적이지만 여전히 약 24GB가 필요합니다. –

답변

1

을 계산해야합니다. 가상 메모리를 사용하더라도 큰 블록을 할당 할 수는 없습니다. 따라서 해결 방법은 파일을 빌드 할 때 파일에 인접성 행렬을 작성하는 것입니다. 이 방법은 MatLab 또는 Python에서 작동합니다.


나는 형식이 당신의 설명과 일치하는 것 때문에 당신이 CAIDA's Router-Level Topology Measurements을 처리하는 가정입니다. 이 파일의 각 행은 하나의 IP 라우터 (열 1)에서 다른 라우터 (열 2)까지의 그래프 가장자리를 포함합니다. 192244 노드의 전체 인접 행렬에는 각 노드에 대해 단일 비트 만 사용한다고 가정하면 4.3GB가 필요합니다. 나는 여전히 행렬을 메모리에 저장하는 대신 파일에 직접 쓰는 것이 좋습니다.

+0

당신은 아직 데이터가 무엇을 의미하는지 설명하지 않았습니다. 그 숫자들은 무엇입니까? –

+0

이 파일이 마음에 듭니다? http://www.caida.org/tools/measurement/skitter/router_topology/itdk0304_rlinks_directed.gz –

0

가장 간단한 방법은 무엇입니까? 글쎄, 당신은 10,000 개 이상의 노드 만 45000 가장자리가있는 경우, SciPy의 희소 행렬 사용

http://www.scipy.org/SciPy_Tutorial#head-c60163f2fd2bab79edd94be43682414f18b90df7

SciPy 아래 매트릭스의 실제 메모리 크기를 유지하기 위해 다양한 압축 방법을 제공합니다 (매트릭스 값 이후 크게 0이됩니다). MatLab은 공간에 민감한 행렬 데이터 구조를 제공합니다.

파일을 읽는 방법을 알고 싶다면 CSV 또는 텍스트 파일로 저장하는 것이 좋습니다 (데이터를 Excel 파일에 저장하는 데 실제 이점이 없음). 파이썬은 읽기/쓰기 CSV 파일을 라이브러리 승/제공 : 당신이 정말로 XLS 파일을 사용하려면, 다음 pyExcelerator 중 하나를 사용할 수 있습니다

http://docs.python.org/library/csv.html

(나는 이것을 사용한 적이) - http://sourceforge.net/projects/pyexcelerator/을 - 또는 OpenOffice.org + PyUNO 또는 MS Office + COM을 사용할 수 있습니다.

+0

필자의 이해가 정확하다면 파일은 단지 노드 쌍 (정수로 표시) 일뿐입니다. 당신은 단지 희소 행렬을 만들고, 쌍을 읽고, 각 쌍에 대해 1로 행렬의 해당 셀을 채 웁니다. – tixxit

+0

pyExcelerator가 유지되지 않습니다. xlrd/xlwt를 사용하여 XLS 파일을 읽고 쓰십시오. –

0

저는 defaultdict를 사용합니다 - 사용하기 쉽고 몇 줄의 코드 만 사용합니다. 내가

a b 
c d 

첫째, 형식이되도록 목록 (http://docs.python.org/2/library/fileinput.html)에 넣어처럼 파일이 보이는 있으리라 믿고있어 [(A, B), (C, D)]. 가장자리가있는 경우

from collections import defaultdict 

adjmat = defaultdict(int) 
for edge in list: 
    adjmat[edge] = 1 

adjmat[a, b] 0, 그렇지 않으면 1을 반환합니다

그런 다음, defaultdict를 사용합니다. 당신은 노드 간의 다수의 모서리를 가질 수 있다면, 당신은 단지 adjmat[edge] += 1에 그 변경해야하고, adjmat[a, b] 가장자리의 수는 a

관련 문제