2012-09-22 5 views
1

웹 크롤러를 파싱 중입니다. 파싱 부분을 구현했습니다. 이제 얻은 URI를 효율적인 데이터 구조로 저장하려고합니다. 무엇을 사용해야합니까 ?? 구문 분석을 위해 Jena 라이브러리를 사용하고 있습니다.웹 크롤러의 URI를 저장하는 가장 효율적인 효율적인 데이터 구조

+0

"효율적인"데이터 구조입니까? 효율적인 방법? URI 목록이 있습니다. 얼마나? 어떻게 액세스해야합니까? 목록에 문제가 있습니까? –

답변

0

해시.

예 : URL : 스키마 : // 도메인 : 포트/경로? query_string # fragment_id.

문자열로 구문 분석 URL 후, URL을 저장하는 등 :

해시 [ '계획'] = 계획;

해시 [ '도메인'] = 도메인;

hash [ 'port'] = port;

해시 [ '경로'] = 경로;

해시 [ 'query_string'] = query_string;

해시 [ 'fragment_id'] = fragment_id;

0

복제본을 자동으로 삭제하여 URI가 두 번 크롤링되지 않도록 하시겠습니까? 그런 다음 HashSet을 제안합니다.

자동으로 중복을 제거하고 최적의 경우 삽입 복잡성은 여전히 ​​일정합니다. 부모 클래스를 사용하여 기본 클래스 java.net.URI이 아닌 URI를 나타낼 때 URI 클래스의 텍스트 기반 해시를 반환하려면 URI 클래스의 int hashCode() 메서드를 재정의해야합니다. Object의 기본 메서드는 내용이 동일한 경우에도 각 객체에 대해 고유 한 해시 코드를 만듭니다.

+1

이미'equals'와'hashCode' 구현을 정의한 표준'java.net.URI'를 사용하지 않으시겠습니까? – Natix

+0

감사합니다. 나는 그 사실을 몰랐습니다. 나는 내 대답을 편집했다. – Philipp

+0

Set 또는 HashSet의 각 요소에 값을 연결할 수도 있습니까? –

0

크롤러는 일반적으로 위의 대기열에 URI를 삽입하고 검사 한 후 집합에 URI를 넣기 전에 Set과 함께 검사 된 URI가 중복되었는지 확인하기 위해 Queue을 사용합니다.

링크 수가 메모리에 들어갈 수 있으면 대기열은 LinkedList이고 설정은 HashSet 일 수 있습니다. 그렇지 않으면 외부 데이터베이스를 용도로 사용하거나 대기열 서버 (예 : ActiveMQ)를 대기열로, 데이터베이스를 집합으로 사용할 수 있습니다.

+0

감사합니다. 또한 Set is it possible의 각 요소에 값을 연결하고 싶습니까? –

+0

그러면'Map'을 사용합니다. –

0

처리 할 URI 큐와 이미 처리 된 URI를 Redis (http://redis.io/)에 저장합니다. Redis는 목록 (URI 대기열) 및 해시 (맵)를 비롯한 다양한 데이터 구조를 기본적으로 지원하는 매우 빠른 반영구적 키 - 값 저장소입니다. 그렇게하면 이러한 데이터 구조가 Java 응용 프로그램을 다시 시작한 후에도 유지됩니다. Redis를 통해 통신하는 데 너무 많은 어려움없이 앱을 여러 번 실행할 수도 있습니다.

+0

이러한 모든 URL을 redis에 저장하면 메모리가 부족해질 수 있습니다. 아니? –

0

일반적으로 웹 크롤링 응용 프로그램에서 - spider traps (때때로 "블랙홀"이라고 함)을 삭제하고 동일한 페이지를 자주 방문하지 않고 페이지 콘텐츠의 글로벌 식별자로 URL을 사용하도록 URL을 관리해야합니다.

그러나 다른 흥미로운 순간 - (웹 페이지의 내용이 시간 변경 될 수 있기 때문에 )를 두 번를 동일한 URL을 방문 폐기 잘못 것입니다.{URL, 해시 (URL)} :

그래서 이러한 요구 사항을 만족하는 가장 좋은 방법은 우선 순위 큐의 어떤 종류를 사용하고 튜플 각 URL을 연결하는 것입니다. 새로운 URL을 얻었을 때 - 단지 해시를 계산하고, 동일한 해쉬를 가진 데이터베이스 레코드를 가지고 있다면 - 단지이 URL에 낮은 우선 순위를 설정하고 우선 순위 큐에 넣으십시오.

웹 크롤러는 방문 URL에 우선 순위 큐를 요청합니다. 따라서 우선 순위가 가장 높은 URL 만 포함 된 페이지가 주로 방문됩니다.

최선의 방법으로 원하는 해시 함수를 구성 할 수 있습니다 (예 : URL 문자열에서 매개 변수를 제거하고 나머지 문자열에서 해시 계산).

+0

그것은 해쉬 맵의 우선 순위 대기열 (튜플 {url, hash (url)}을 저장해야 함을 의미 함) –

+0

@Prannoy Mittal, 아니요. 개념 만 설명했습니다. 저장소 모두 : 해시 및 URL (예 : 관계형 데이터베이스 인 경우 url과 해시에 대해 두 개의 열을 만들고, 해시가있는 열의 인덱스를 추가 할 수도 있습니다. 왜냐하면 해시로 URL을 비교하기 때문입니다.) 일부 URL : - 먼저 해시를 계산하고 두 번째로 해시가 저장소에 있는지 확인하고 존재하는 경우 낮은 우선 순위 (존재하지 않는 경우 높은 우선 순위로 설정)를 입력하고 대기열에이 URL을 추가합니다. – stemm

관련 문제