2014-07-07 2 views
0

저는 스트리밍 API를 통해 트위터를 크롤링하고 검색된 트윗을 키워드/해시 태그/사용자별로 필터링하려고했습니다. 여기 트위터 크롤러 : 왜 메모리가 커질까요?

사용하여 내 예입니다 (같은 문제가 Twitter4J으로 발생하지만) HBC :

private Runnable defineRunnable(final BlockingQueue<String> queue) { 
    return new Runnable() { 

     @Override 
     public void run() { 
      while (true) 
       try { 
        System.out.println(queue.take()); 
       } 
       catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
     } 

    }; 
} 

그러나, 프로세스에서 성장을 계속 :

// After connection: 
final BlockingQueue<String> queue = new LinkedBlockingQueue<String>(10000); 

StatusesFilterEndpoint filterQuery = new StatusesFilterEndpoint(); 
filterQuery.followings(myListOfUserIDs); 
filterQuery.trackTerms(myListOfKeywordsAndHashtags); 

final ExecutorService executor = Executors.newFixedThreadPool(4); 

Runnable tweetAnalyzer = defineRunnable(queue); 
for (int i = 0; i < NUM_THREADS; i++) 
    executor.execute(tweetAnalyzer); 

분석기 tweetAnalyzer에 의해 반환되는 경우 기억.

두 질문 :이 메모리에 성장하지 않고 RAM을 포화되지 않도록

  1. 어떻게 제대로 크롤러를 설계하는 방법?
  2. 포화 상태가되지 않도록 큐 길이 (여기에서 10000으로 설정)를 선택하는 방법은 무엇입니까? 나는이 길이를 사용하여 대기열이 계속 짹짹으로 가득 찼다는 것을 보았습니다. (결코 비어 있지 않습니다.) 큰 덩어리 인 700 트윗/분을 크롤링 할 수 있습니다.

감사합니다.

답변

0

당신이 제공 한 발췌 문장에서 판단하기가 약간 어렵습니다. StatusesFilterEndpoint를 올바르게 등록합니까?

대기열의 크기를 모니터링하기 위해 별도의 스레드를 작성하는 것이 좋습니다.

분명히 당신이 다운로드 한 모든 트위터 메시지를 진행할 수 없습니다. 그래서 당신은 할 수 있습니다

  1. 는 매 n 메시지를 멀리 던져보다 적극적
  2. 샘플 입력을 필터링하여 다운로드 트윗의 수를 줄일 수 있습니다.
  3. 트위터 분석기의 경우이 질문에 도움이되지 않을 수도 있지만 빠른 컴퓨터를 사용하십시오.
  4. 클러스터에 배포
+0

"클러스터에 배포"가 가장 좋은 옵션 일 수 있습니다. :) – Eleanore

관련 문제