2010-06-18 9 views
4

Le titre pourrait être un peu trompeur, mais je ne pouvais pas trouver un meilleur titre. J'écris un moteur de recherche simple qui va chercher sur plusieurs sites pour le domaine spécifique. Pour être concret: j'écris un moteur de recherche pour les livesets/aftermovies/tracks hardstyle. Pour faire, je vais chercher sur les sites qui fournissent des livesets, des pistes, et autres. Le problème ici est la vitesse, je dois passer la requête de recherche à 5-7 sites, obtenir les résultats et ensuite utiliser mon propre algorithme pour afficher les résultats dans un ordre trié. Je pourrais juste le «multithread», mais c'est plus facile à dire, alors j'ai quelques questions.Écrire un moteur de recherche

  1. Quelle serait la meilleure solution à ce problème? Devrais-je simplement multithread/traiter cette application, donc je vais obtenir un peu d'accélération?

  2. Y at-il d'autres solutions ou je fais quelque chose de vraiment mal?

Merci,

William van Doorn

Répondre

3

À moins que vous essayez d'apprendre multithreading, évitez d'écrire l'infrastructure pour vous-même. Synchroniser beaucoup de tâches qui pourraient prendre des temps différents, gérer les échecs, etc., c'est un gâchis.

Pour les tâches en grande partie parallélisables (telles que l'interrogation de plusieurs sites, la combinaison de résultats, etc.), vous pouvez examiner les infrastructures existantes. Mapper/réduire les frameworks (tels que Hadoop for Java) peut gérer une partie de cela pour vous, vous permettant de vous concentrer sur la logique de votre application.

+0

Cette infrastructure serait-elle si compliquée?Maintenant, nous parlons de Java, je pourrais juste créer un ExecutorService avec un Runnable simple. Mais va regarder Hadoop, merci. – wvd

+0

@wvd: Cela dépend vraiment de l'échelle et de ce que vous voulez paralléliser. Pour les petites entrées et les résultats, vous pouvez broyer le vôtre. Si vous avez des tonnes de sites à interroger et des tonnes de résultats à combiner, et surtout si vous devez utiliser plusieurs processus pour interroger un grand nombre de résultats, l'infrastructure et la robustesse d'un outil Aidez-moi. – Uri

+0

Merci, j'ai eu ma réponse. – wvd

0

Utilisez Google? ;)

Le goulot d'étranglement sera le téléchargement de l'information multithreading aidera.

Sinon, téléchargez uniquement le code HTML.

0

Je vais essayer d'utiliser un code pseudo ici:

// 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 
} 
+0

Ouais, je sais comment le faire - mais je suis juste intéressé si c'était vraiment le bon moyen. – wvd

+0

Quelqu'un peut le trouver utile, vous ne pensez pas? –

1

Dans le cas particulier d'un moteur de recherche Je vous recommande de vérifier Solr ou Lucene. Pour 5-7 sites Hadoop sera probablement exagéré. L'indexation incrémentale est possible et ajoute également des métadonnées spécifiques à chacune des choses interrogeables. Je peux imaginer que ces sites publient beaucoup de leur contenu dans des flux RSS que vous pouvez utiliser pour garder vos index à jour plus rapidement que vous le feriez en les explorant continuellement.

Le moteur de recherche lui-même permet toutes sortes de façons intéressantes d'obtenir rapidement vos résultats pour le post-traitement ou l'affichage immédiat à vos utilisateurs. Pour la parallélisation, il existe un excellent support dans les packages JSR-166y (java.util.concurrent) qui permettent la parallélisation sans maux de tête si vous respectez l'un des modèles proposés. Ils fonctionnent vraiment bien.

Juste quelques pensées.

0

Vous pouvez utiliser Map/Reduce pour ce type de tâche. Hadoop est une implémentation en Java