【发布时间】: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();
}
}
};
}
但是,进程在内存中继续增长。
两个问题:
- 如何正确设计此爬虫,使其不会在内存中增长并且不会使 RAM 饱和?
- 如何选择最佳队列长度(这里设置为
10000)以使其不饱和?我已经看到,使用这个长度,队列继续充满推文(它永远不会变空),我能够以 700 条推文/分钟的速度抓取,这是巨大的)
提前谢谢你。
【问题讨论】:
标签: performance memory twitter web-crawler