Buon approccio per centinaia di consumatori e file di grandi dimensioni

0

Ho diversi file (quasi 1 GB ciascuno) con dati. I dati sono una stringa.

Ho bisogno di elaborare ognuno di questi file con diverse centinaia di consumatori. Ognuno di questi consumatori fa un processo che si differenzia dagli altri. I consumatori non scrivono ovunque contemporaneamente. Hanno solo bisogno di una stringa di input. Dopo l'elaborazione, aggiornano i loro buffer locali. I consumatori possono essere facilmente eseguiti in parallelo.

Importante: con un file specifico ogni consumatore deve elaborare tutte le linee (senza saltare) nell'ordine corretto (come appaiono nel file). L'ordine di elaborazione di file diversi non ha importanza.

L'elaborazione di una singola linea da parte di un solo consumatore è comparabilmente veloce. Mi aspetto meno di 50 microsecondi su Corei5.

Quindi ora sto cercando il buon approccio a questo problema. Questo sarà parte di un progetto .NET, quindi per favore restiamo con .NET solo (è preferibile C #).

So di TPL e DataFlow. Immagino che il più rilevante sarebbe BroadcastBlock . Ma penso che il problema qui sia che con ogni linea dovrò aspettare che tutti i consumatori finiscano per postare quello nuovo. Immagino che non sarebbe molto efficiente.

Penso che la situazione ideale sarebbe una cosa del genere:

  1. Un thread legge dal file e scrive nel buffer.
  2. Ogni utente, quando è pronto, legge simultaneamente la riga dal buffer e la elabora.
  3. La voce dal buffer non dovrebbe essere cancellata man mano che un utente la legge. Può essere cancellato solo quando tutti i consumatori lo hanno elaborato.
  4. TPL pianifica le discussioni dei consumatori stesse.
  5. Se un consumatore supera gli altri, non dovrebbe aspettare e può leggere le voci più recenti dal buffer.

Ho ragione con questo tipo di approccio? Se sì o no, come posso implementare la buona soluzione?

Mi è stato suggerito di spostare qui la domanda come luogo più appropriato da StackOverflow.

Aggiornamento: Secondo il commento di david.pfx, ecco alcuni dettagli. Le prestazioni sono al primo posto, la facilità di manutenzione è al secondo.

    
posta shda 30.05.2014 - 23:19
fonte

1 risposta

1

Utilizza un canale diverso su una coda di messaggi per ciascun utente. Per ogni riga di uno dei tuoi file di grandi dimensioni, scrivi un messaggio per ogni canale (ad esempio, ciascun utente). Ogni utente può elaborare i messaggi sul proprio canale eliminando i messaggi una volta ricevuti.

    
risposta data 18.06.2014 - 16:38
fonte

Leggi altre domande sui tag