标题可能有点误导,但我找不到更好的标题。我正在编写一个简单的搜索引擎,它将搜索特定域的多个站点。具体来说:我正在为hardstyle livesets / aftermovies / tracks编写搜索引擎。为此,我将搜索提供livesets,track等的网站。这里的问题是速度,我需要将搜索查询传递给5-7个站点,获取结果,然后使用我自己的算法以排序顺序显示结果。我可以“多线程”它,但它说起来更容易,所以我有几个问题。
这个问题的最佳解决方案是什么?我应该多线程/处理这个应用程序,所以我会加快一点速度吗?
还有其他解决方案或我做错了吗?
谢谢,
William van Doorn
答案 0 :(得分:3)
除非您尝试学习多线程,否则请避免为此自行编写基础结构。同步许多可能需要不同时间的任务,处理故障等等,这很糟糕。
对于大部分可并行化的任务(例如查询多个站点,组合结果等),您可能希望查看现有的基础结构。
Map / reduce框架(例如Hadoop for Java)可以为您处理其中一些内容,让您专注于应用程序的逻辑。
答案 1 :(得分:1)
在搜索引擎的特定情况下,我建议您查看Solr或Lucene。对于5-7个站点,Hadoop可能会过度杀伤。 可以进行增量索引,还可以为每个可搜索的内容添加特定的元数据。
我可以想象这些网站也会在RSS Feed中发布他们的大量内容,您可以使用它们来保持索引的最新速度,而不是连续抓取它们。
搜索引擎本身允许各种有趣的方式快速获得结果,以便进行后期处理或立即显示给用户。
对于并行化,JSR-166y软件包(java.util.concurrent)提供了极好的支持,如果您坚持使用其中一种模式,它们允许并行化而不会头疼。他们工作得很好。
只是一些想法。
答案 2 :(得分:0)
使用Google? ;)
瓶颈将是下载信息多线程将有所帮助。
否则只下载html。
答案 3 :(得分:0)
我会尝试在这里使用一些伪代码:
// main thread
barrier = Barrier(numberOfQueries) // initialize the barrier
// with number of working threads
for (i = 0; i < numberOfQueries; i++) {
workers(i) = Worker(i, barrier) // create a worker passing the barrier
workers(i).start() // start a worker
}
barrier.await() // wait until the barrier resets to ZERO
for (i = 0; i < numberOfQueries; i++) {
results(i) = workers(i).result // collect the results
}
display(results) // display the results
// worker thread
function start() {
doTheJob() // do the long job of querying a site
this.barrier.decrement // once the job is finished decrement the barrier
}
答案 4 :(得分:0)
您可以使用Map / Reduce执行此类任务。 Hadoop是java中的一个实现