Frage

Ich habe eine Binärlogdatei mit Streaming-Daten von einem Sensor (Int16).
Alle 6 Sekunden 6000 Proben des Typs Int16 hinzugefügt werden, bis der Sensor nicht angeschlossen ist.

Ich brauche diese Datei in regelmäßigen Abständen abgefragt wird, von den letzten Position fortgesetzt lesen. Ist es besser, a) ein Filestream und Binär-Leser geöffnet und instanziert zwischen Lesungen b) Instanziieren Filestream und binäre reader jedesmal I lesen müssen (und halten eine externe Variable die letzte Position zu verfolgen lesen) c) etwas besser?

EDIT: Einige großen Vorschläge so weit, hinzufügen müssen, dass das „Server“ App von einem externen Lieferanten geliefert wird und nicht geändert werden kann

.
War es hilfreich?

Lösung

Wenn es immer die gleiche Menge an Daten hinzufügen, kann es Sinn machen, es erneut zu öffnen. Sie könnten die Länge, um herauszufinden, bevor Sie es öffnen und dann auf die gesamte Anzahl der „Sample-Sets“ zur Verfügung, nur für den Fall abrunden Sie es fangen, während es noch ist, die Daten zu schreiben. Das kann bedeuten, Sie lesen weniger, als Sie könnte lesen (wenn der Schreib endet zwischen Ihnen, die Länge und Starten der Leseprüfung), aber Sie werden beim nächsten Mal nachholen.

Sie müssen sicherstellen, dass Sie über die entsprechenden Freigabe-Optionen verwenden, so dass der Schreiber noch schreiben, während Sie aber gerade lesen. (Der Autor wird wahrscheinlich dazu wurde auch im Sinne hat, geschrieben.)

Andere Tipps

Können Sie MemoryMappedFiles ?

Wenn Sie können, die Abbildung der Datei im Speicher und teilen es zwischen Prozessen können Sie die Daten lesen, indem Sie einfach den Offset für Ihren Zeiger jedes Mal erhöht wird.

Wenn Sie es mit einem Ereignis verbinden Sie Ihre Leser geben an, wenn er kann in eine gehen, um die Informationen lesen. Es wird keine Notwendigkeit, etwas zu blockieren, wie der Leser immer „alte“ Daten gelesen werden, die bereits geschrieben wurde.

würde ich empfehlen, Rohre verwenden, wirken sie wie Dateien, außer Stream-Daten direkt zwischen den Anwendungen, auch wenn die Anwendungen auf verschiedenen PCs laufen (obwohl dies wirklich nur eine Option ist, wenn Sie in der Lage sind beide Anwendungen zu ändern). Check it out unter dem "System.IO.Pipes" Namespace.

P. S. Sie würden für diesen ein „Namen“ Rohr verwenden (Rohre werden in ‚c‘ ebenfalls unterstützt, so dass im Grunde jede halbwegs anständige Programmiersprache sollte sich in der Lage zu implementieren)

Ich denke, dass (a) ist das beste, weil:

  • wird die aktuelle Position erhöht werden, wie Sie lesen und Sie brauchen nicht zu befürchten, es zu speichern, irgendwo;
  • Sie müssen nicht, sie zu öffnen und gewünschte Position suchen (es ist nicht viel langsamer wieder zu öffnen sein soll, aber es offen gibt OS einige Hinweise für die Optimierung zu halten glaube ich) jedes Mal, wenn Sie es abfragen;
  • Andere Lösungen, die ich denken kann aus erfordert PInvokes zu System Inter Synchronisation Primitiven. Und sie werden nicht schneller sein als Dateioperationen bereits im Rahmen.

Sie müssen nur die richtigen Fileshare-Flags setzen:

Just zum Beispiel:

Server:

using(var writer = new BinaryWriter(new FileStream(@"D:\testlog.log", FileMode.Append, FileAccess.Write, FileShare.Read)))
{
    int n;
    while(Int32.TryParse(Console.ReadLine(), out n))
    {
        writer.Write(n);
        writer.Flush(); // write cached bytes to file
    }
}

Auftraggeber:

using (var reader = new BinaryReader(new FileStream(@"D:\testlog.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
    string s;
    while (Console.ReadLine() != "exit")
    {
        // allocate buffer for new ints
        Int32[] buffer = new Int32[(reader.BaseStream.Length - reader.BaseStream.Position) / sizeof(Int32)];

        Console.WriteLine("Stream length: {0}", reader.BaseStream.Length);
        Console.Write("Ints read: ");
        for (int i = 0; i < buffer.Length; i++)
        {
            buffer[i] = reader.ReadInt32();
            Console.Write((i == 0 ? "" : ", ") + buffer[i].ToString());
        }
        Console.WriteLine();
    }
}

Sie können auch die Daten in eine Datenbank streamen, anstatt eine Datei als eine andere Alternative, dann würden Sie nicht über das Sperren von Dateien sorgen.

, aber wenn Sie mit der Datei-Methode fest sind, können Sie die Datei jedes Mal, wenn Daten von ihm zu lesen schließen mögen; es hängt viel ab, wie kompliziert der Prozess in die Datei zu schreiben ist sein würde, und ob sie eine Datei erfassen Betrieb Sperren und angemessen reagieren, ohne fürchterlich abstürzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top