문제

방금 Wikipedia (영어)에 관한 많은 링크 구조 데이터 전송을 마쳤습니다. 기본적으로 Wikipedia의 SQL 덤프를 다운로드했습니다. 최신 덤프 저장소. MySQL 대신 PostgreSQL을 사용하고 있으므로이 모든 덤프를 DB에로드하기로 결정했습니다. 파이프 라인 쉘 명령.

어쨌든,이 테이블 중 하나는 2 억 9,500 만 행을 가지고 있습니다. pagelinks 테이블; 여기에는 모든 위키 내 하이퍼 링크가 포함되어 있습니다. 내 노트북에서 pgadmin III을 사용하여 다음 명령을 데이터베이스 서버 (다른 컴퓨터)에 보냈습니다.

SELECT pl_namespace, COUNT(*) FROM pagelinks GROUP BY (pl_namespace);

지금은 한 시간 정도였습니다. 문제는 우체국 장이 내 매우 제한된 HD 공간을 점점 더 많이 먹는 것 같습니다. 나는 그것이 현재 약 20GB를 먹었다고 생각합니다. 나는 이전에 Postgresql.conf 파일과 함께 연주하여 12GB의 RAM으로 실행되기 위해 더 많은 성능 유연성 (예 : 더 많은 리소스를 사용하도록 함)을 제공했습니다. 나는 기본적으로 대부분의 바이트 와이 파일의 관련 변수가 더 많은 RAM을 사용하여 그 일을 할 것이라고 생각했습니다.

그러나 DB는 많은 RAM을 사용하지 않는 것 같습니다. Linux 시스템 모니터를 사용하여 Postmaster가 1.6GB의 공유 메모리 (RAM)를 사용하고 있음을 알 수 있습니다. 어쨌든, 나는 너희들이 내가하는 일을 더 잘 이해하도록 도울 수 있는지 궁금해했다. PostgreSQL이 HD 리소스를 사용하는 방법.

Wikipedia 데이터베이스의 Metrastructure와 관련하여, 그들은 좋은 것을 제공합니다. 개요 그것은 사용하거나 심지어 당신에게 관심이있을 수 있습니다.

자세한 내용은 언제든지 thx.

도움이 되었습니까?

해결책

아마도 문제를 일으키는 것은 아마도 그룹 일 것입니다. 그룹화를하기 위해 데이터베이스는 중복 항목을 모으기 위해 행을 정렬해야합니다. 색인은 아마도 도움이되지 않을 것입니다. 대대적 인 계산 :

각 행이 100 바이트의 공간을 차지한다고 가정하면 29,500,000 바이트 또는 약 30GB의 저장 장치입니다. 메모리에 모든 것을 맞출 수는 없으므로 시스템이 스래싱을하고 있으며, 이는 1000 이상의 계수가 느려집니다. 스왑 파일을 사용하는 경우 HD 공간이 스왑 공간으로 사라질 수 있습니다.

이 계산을 한 번만 수행 해야하는 경우 데이터의 작은 서브 세트로 분리하십시오. pl_namespace가 숫자이고 1-295million의 범위라고 가정하면 다음과 같은 것을 시도하십시오.

SELECT pl_namespace, COUNT(*)
FROM pagelinks
WHERE pl_namespace between 1 and 50000000
GROUP BY (pl_namespace);

그런 다음 50000001-100000000 등을 동일하게 수행하십시오. Union을 사용하여 함께 답변을 결합하거나 외부 프로그램으로 결과를 간단하게 표로 작성하십시오. 그룹을 돕지 않는 색인에 대해 내가 쓴 내용을 잊어 버리십시오. 여기서 인덱스는 WHERE 절을 도와줍니다.

다른 팁

바로 그거죠 9.5MB의 RAM을 취하고 있다고 주장하고 있습니까? 나에게는 거의 들리지 않을 것 같다 - 거의 확실하게 공유 된 기억 ~이다 다른 Postgres 프로세스간에 공유되는 RAM. (내가 기억하는 바에 따르면, 각 클라이언트는 별도의 프로세스로 끝나지만 오래되었지만 매우 잘못 될 수 있습니다.)

당신은에 인덱스가 있습니까? pl_namespace 열? 뚜렷한 결과가 많으면 쿼리가 색인이없는 2 억 9,500 만 행 테이블에서 쿼리가 꽤 무겁다는 것을 상상할 수 있습니다. 말하지만 10GB는 삼키기가 끔찍합니다. 어떤 파일이 쓰고 있는지 알고 있습니까?

좋아, 여기에 요점이 있습니다.

Clause에 의한 그룹은 인덱스를 잘못 만들었으므로 Postmaster (Postgresql Server Process)는 디렉토리 $ pgdata/base/16384/pgsql_tmp에 위치한 많은 테이블 (23GB 테이블)을 만들기로 결정했습니다.

PostgreSQL.conf 파일을 수정할 때 PostgreSQL에 1.6GB의 RAM을 사용할 수있는 권한을 부여했습니다 (이제 11.7GB의 RAM에 액세스 할 수 있습니다). Postmaster 프로세스는 실제로 1.6GB의 RAM을 사용하고 있었지만 충분하지 않으므로 PGSQL_TMP 디렉토리입니다.

배리 브라운 (Barry Brown)이 지적한 바와 같이, 나는이 SQL 명령 만 실행하여 pagelinks.namespaces, 나는 2 억 9,600 만의 하위 집합을 질문 할 수 있었다. pagelinks (이것은 그들이 설문 조사를 위해하는 일입니다).

명령이 결과 세트를 반환했을 때, 모든 임시 테이블은 아무 일도 일어나지 않은 것처럼 자동으로 삭제되었습니다.

당신의 도움을 위해 thx!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top