Domanda

Ok, ecco in breve l'accordo:Esamino il web (tutti i tipi di dati, blog/notizie/forum) così come appare su Internet.Quindi elaboro questo feed ed eseguo analisi sui dati elaborati.Il ragno non è un grosso problema.Posso ottenerlo praticamente in tempo reale man mano che Internet riceve nuovi dati.L'elaborazione è un collo di bottiglia, coinvolge alcuni algoritmi computazionalmente pesanti.

Sto cercando di costruire una strategia per programmare i miei spider.L'obiettivo principale è garantire che l'analisi prodotta come risultato finale rifletta l'effetto del maggior numero possibile di input recenti.Cominciate a pensarci, l’obiettivo ovvio è quello di garantire che i dati non si accumulino.Ottengo i dati tramite gli spider, passo al codice di elaborazione, aspetto che l'elaborazione finisca e poi faccio altri spider.Questa volta portando tutti i dati che sono apparsi mentre aspettavo che l'elaborazione finisse.Ok, questo è un pensiero molto ampio.

Qualcuno di voi può condividere i propri pensieri, magari pensare ad alta voce.Se fossi in me cosa ti passerebbe per la mente?Spero di aver dato un senso alla mia domanda.A proposito, questa non è l'indicizzazione di un motore di ricerca.

È stato utile?

Soluzione

Sembra che vuoi evitare che i processori rimangano troppo indietro rispetto agli spider.Immagino che tu voglia essere in grado di ridimensionare anche questo.

Il mio consiglio è di implementare una coda utilizzando un database SQL client/server.MySQL funzionerebbe bene per questo scopo.


Obiettivi di progettazione

  • Evita che gli spider si allontanino troppo dai processori
  • Consentire un equilibrio di potere tra spider e processori (tenendoli occupati)
  • Mantieni i dati il ​​più aggiornati possibile
  • Scalare e aumentare secondo necessità

Coda:Crea una coda per archiviare i dati degli spider prima che vengano elaborati.Questo potrebbe essere fatto in diversi modi, ma non sembra che l'IO sia il collo di bottiglia.

Un approccio semplice sarebbe quello di avere una tabella SQL con questo layout:

TABLE Queue
    Queue_ID int unsigned not null auto_increment primary key
    CreateDate datetime not null
    Status enum ('New', 'Processing')
    Data blob not null

# pseudo code
function get_from_queue()
    # in SQL
    START TRANSACTION;
    SELECT Queue_ID, Data FROM Queue WHERE Status = 'New' LIMIT 1 FOR UPDATE;
    UPDATE Queue SET Status = 'Processing' WHERE Queue_ID = (from above)
    COMMIT
    # end sql

    return Data# or false in the case of no records found

# pseudo code
function count_from_queue()
    # in SQL
    SELECT COUNT(*) FROM Queue WHERE Status = 'New'
    # end sql
    return (the count)

Ragno:

Quindi hai più processi spider..Ognuno di loro dice:

if count_from_queue() < 10:
    # do the spider thing
    # save it in the queue
else:
    # sleep awhile

repeat

In questo modo ogni ragno sarà l'uno o l'altro riposando O ragno.La decisione (in questo caso) si basa sul fatto che ci siano meno di 10 elementi in sospeso da elaborare.Lo adatteresti ai tuoi scopi.


Processore

Quindi hai più processi del processore..Ognuno di loro dice:

Data = get_from_queue()
if Data:
    # process it
    # remove it from the queue
else:
    # sleep awhile

repeat

In questo modo, ogni processore sarà l'uno o l'altro riposando O in lavorazione.


In sintesi: Sia che tu lo abbia in esecuzione su un computer o su 20, una coda fornirà il controllo necessario per garantire che tutte le parti siano sincronizzate e non siano troppo avanti l'una rispetto all'altra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top