【问题标题】:Twitter crawler: why does the memory grow?Twitter爬虫:为什么内存会增长?
【发布时间】:2014-07-07 20:25:59
【问题描述】:

我一直在尝试通过 Streaming API 并通过关键字/主题标签/用户过滤检索到的推文来抓取 Twitter。

这是我使用 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 条推文/分钟的速度抓取,这是巨大的)

提前谢谢你。

【问题讨论】:

    标签: performance memory twitter web-crawler


    【解决方案1】:

    从您提供的 sn-ps 中确定有点困难。您是否正确注册了 StatusesFilterEndpoint?

    我建议你写一个单独的线程来监控队列的大小。

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

    1. 通过更积极的过滤减少您下载的推文数量
    2. 通过丢弃每 n 条消息对输入进行采样。
    3. 使用速度更快的机器,尽管对于您在问题中显示的 tweetAnalyzer,这可能无济于事。
    4. 在集群上部署

    【讨论】:

    • “在集群上部署”可能是最好的选择 :)
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多