Twitter抓取器:为什么内存会增长?

时间:2014-07-07 09:33:30

标签: performance memory twitter web-crawler

我一直试图通过Streaming API抓取Twitter,并通过keywords / hashtags / users过滤检索到的推文。

以下是使用HBC的示例(虽然Twitter4J也出现同样的问题):

// 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的位置:

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();
                }
        }

    };
}

然而,这个过程在记忆中继续增长。

两个问题:

  1. 如何正确设计此爬虫,以便它不会在内存中增长并且不会使RAM饱和?
  2. 如何选择最佳队列长度(此处设置为10000)以使其不会饱和?我已经看到使用这个长度的队列继续充满了推文(它永远不会是空的)我能够抓取700条推文/分钟,这是巨大的)
  3. 提前谢谢。

1 个答案:

答案 0 :(得分:0)

从您提供的代码段确定有点困难。您是否正确注册了StatusesFilterEndpoint?

我建议您编写一个单独的线程来监视队列的大小。

很明显,您无法继续下载所有推文消息。所以你只能:

  1. 通过更积极地过滤来减少您下载的推文数量
  2. 通过丢弃每条消息来对输入进行取样。
  3. 使用更快的机器,但对于你在问题中显示的tweetAnalyzer,这可能没什么帮助。
  4. 在群集上部署