Domanda

Sto scrivendo un app che ha bisogno di elaborare un file di testo di grandi dimensioni (separati da virgole con diversi tipi di record - Io non ho il potere o la voglia di cambiare il formato di memorizzazione dei dati). Si legge nei documenti (spesso tutti i record del file in modo sequenziale, ma non sempre), quindi i dati per ogni record è spacciate per un po 'di elaborazione.

In questo momento questa parte l'applicazione è a thread singolo (leggi un record, elaborarla, leggere il record successivo, ecc) Sto pensando che potrebbe essere più efficiente per leggere i record in una coda in un thread, e il processo in altro filo in piccoli blocchi o appena saranno disponibili.

Non ho idea di come iniziare a programmare una cosa del genere, tra cui la struttura dei dati che sarebbe necessario o come implementare il multithreading in modo corretto. Qualcuno può dare qualsiasi puntatori, o offrire altri suggerimenti su come avrei potuto migliorare le prestazioni qui?

È stato utile?

Soluzione

potrebbe ottenere un vantaggio se è possibile bilanciare il tempo di di elaborazione record contro il tempo lettura record; nel qual caso si potrebbe usare una configurazione produttore / consumatore, ad esempio coda sincronizzato e un lavoratore (o pochi) dequeueing e di trasformazione. Potrei anche essere tentato di indagare le estensioni parallele; è pertty facile scrivere una versione IEnumerable<T> del codice di lettura, dopo di che Parallel.ForEach (o uno degli altri metodi Parallel) dovrebbe effettivamente fare tutto quello che vuoi; per esempio:

static IEnumerable<Person> ReadPeople(string path) {
    using(var reader = File.OpenText(path)) {
        string line;
        while((line = reader.ReadLine()) != null) {
            string[] parts = line.Split(',');
            yield return new Person(parts[0], int.Parse(parts[1]);
        }
    }
}

Altri suggerimenti

Date un'occhiata a questo tutorial, che contiene tutto ciò che serve ... Queste sono le esercitazioni Microsoft, tra cui esempi di codice per un caso simile, come si descrive. Il tuo produttore riempie la coda, mentre il consumatore si apre record off.

creazione, l'avvio e l'interazione tra i thread

Sincronizzazione due thread: un produttore e un consumo

Si può anche guardare a I / O asincrono . In questo stile, potrai iniziare un'operazione di file dal thread principale, si proseguirà poi in esecuzione in background e quando completa, si invoca un callback specificato. Nel frattempo, è possibile continuare a fare altre cose (come ad esempio l'elaborazione dei dati). Ad esempio, si potrebbe iniziare un'operazione asincrona per leggere i prossimi 1000 byte, quindi elaborare i 1000 byte che già avete e poi attendere il prossimo kilobyte.

Purtroppo, la programmazione operazioni asincrone in C # è un po 'doloroso. C'è un MSDN campione , ma non è affatto piacevole. Questo può essere ben risolto in F # utilizzando i flussi di lavoro asincroni. Ho scritto un articolo che spiega il problema e mostra come fare cosa simile utilizzando C # iteratori .

Una soluzione più promettente per il C # è Wintellect biblioteca PowerThreading che supporta trucco simile utilizzando C # iteratori. C'è un buon articolo introduttivo in MSDN affari Concorrenza di Jeffrey Richter.

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