Schnelle Datenerfassung / Protokollierung eines separaten Threads in C #

8

Wir entwickeln eine Anwendung, die kontinuierlich Daten von mehreren externen Hardwaregeräten liest. Die Datenrate liegt je nach externer Hardwarekonfiguration zwischen 0,5 MB - 10 MB / Sek.

Das Lesen der externen Geräte wird derzeit auf einem BackgroundWorker durchgeführt. Der Versuch, die erfassten Daten mit demselben BackgroundWorker auf die Festplatte zu schreiben, scheint keine gute Lösung zu sein. Daher möchten wir diese Daten in eine Datei schreiben und einen anderen Thread die Daten aus der Warteschlange nehmen und in diese schreiben eine Datei. Beachten Sie, dass für die Daten ein einzelner Produzent und ein einzelner Verbraucher vorhanden ist.

Wir überlegen, eine synchronisierte Warteschlange für diesen Zweck zu verwenden. Aber wir dachten, dass dieses Rad schon so viele Male erfunden worden ist, also sollten wir die SO-Community nach etwas Input fragen.

Alle Vorschläge oder Kommentare zu Dingen, auf die wir achten sollten, wären willkommen.

    
SomethingBetter 12.10.2010, 07:49
quelle

5 Antworten

2

Ich bin ziemlich zuversichtlich, dass Ihre Warteschlange ziemlich in Ordnung sein wird. Aber stellen Sie sicher, dass Sie eine effiziente Methode zum Speichern / Abrufen von Daten verwenden, um Ihre Protokollierung mit Speicherzuweisung / Freigabe nicht zu überholen. Ich würde für einen vorher zugewiesenen Speicherpuffer gehen und ihn als eine ringförmige Warteschlange verwenden.

    
Daniel Mošmondor 12.10.2010, 08:51
quelle
3

Ich würde tun, was eine Kombination aus was Herr 888 tut.

Grundsätzlich haben Sie 2 Hintergrundarbeiter, eine, die vom Hardwaregerät liest. eine, die die Daten auf die Festplatte schreibt.

Hardware-Hintergrundarbeiter:
Fügt Daten aus der Hardware in der Warteschlange hinzu. In welchem ​​Format auch immer Sie es haben.

Hintergrundarbeiter schreiben
Analysiert die Daten bei Bedarf und legt sie auf Festplatte ab.

Eine Sache, die Sie hier beachten sollten, ist, die Daten von der Hardware so schnell wie möglich auf die Festplatte zu bringen Wenn ja, dann würde ich den write brackground test grundsätzlich in einer Schleife mit einem 100ms oder 10ms Schlaf in der while-Schleife haben und prüfen, ob die que Daten enthält.
Wenn Nein, Dann würde ich es entweder eine ähnliche Menge schlafen lassen (die Annahme, dass die Geschwindigkeit, die Sie von Ihrer Hardware bekommen, ändert sich regelmäßig) und nur auf die Festplatte schreiben, wenn es etwa 50-60 MB Daten hat. Ich würde es auf diese Weise tun, weil moderne Festplatten etwa 60 MB pro Sekunde schreiben können (Dies ist eine Desktop-Festplatte, Ihr Unternehmen könnte einmal viel schneller sein) und ständig Daten in kleinen Chucks zu schreiben ist eine Verschwendung von IO-Bandbreite / p>     

EKS 12.10.2010 16:58
quelle
2

Sie müssen möglicherweise queing

z. Code

%Vor%

und verwenden Sie einen anderen Thread, um die Warteschlange zu öffnen

%Vor%     
Bonshington 12.10.2010 09:41
quelle
0

Ich habe eine ähnliche Situation, in meinem Fall habe ich eine asynchrone Lockfree Queue mit einem LIFO synchronen Objekt verwendet Grundsätzlich setzen die Threads, die in die Warteschlange schreiben, das Sync-Objekt in das LIFO, während die anderen Threads 'Worker' das Sync-Objekt im LIFO zurücksetzen Wir haben die Anzahl der Synchronisationsobjekte, die den Threads entsprechen, festgelegt. Der Grund für die Verwendung eines LIFO ist, dass die Mindestanzahl von Threads läuft und das Cache-System besser genutzt wird.

    
Ibrahim 01.11.2015 08:46
quelle
-1

Haben Sie versucht MSMQ

    
RameshVel 12.10.2010 08:17
quelle