2009-02-26 6 views
4

Die Frage mit dem Wort „Stream“, weil die Frage unter dem Titel ist ein konkretes Beispiel für einen generischen Zweifel ich über Bäche habe:-Stream (.NET) Umgang mit Best Practices

Ich habe ein Problem, das akzeptiert zwei lösungen und ich will die beste wissen:

  • Ich lade eine Datei, speichern Sie es auf der Festplatte (2 min), lesen Sie es und schreiben Sie den Inhalt in die DB (+ 2 min).
  • Ich lade eine Datei herunter und schreibe den Inhalt direkt in die DB (3 min).
  • Wenn das Schreiben in die DB fehlschlägt, muss ich im zweiten Fall noch einmal herunterladen, aber nicht im ersten Fall.

    Welches ist das beste? Was würdest du benutzen?

    Antwort

    2

    Detail Jekke Antwort:

    auf dem Dateisystem erstellt für das Scheitern viele Gelegenheiten Je (Sie müssen einen gültigen Dateinamen erstellen, stellen Sie sicher, dass das Dateisystem nicht voll ist, stellen Sie sicher, dass die Datei geöffnet werden kann und geschrieben von Ihnen, aber nicht von irgendjemand anderem, was ist mit gleichzeitiger Nutzung, usw.).

    Der einzige Vorteil des Schreibens in eine Datei, die ich mir vorstellen kann, ist, dass Sie wissen, dass der Download erfolgreich abgeschlossen wurde, bevor Sie irgendetwas mit der Datenbank machen. Wenn Sie den Inhalt im Speicher halten können, tun Sie das stattdessen. Wenn Sie nicht wirklich darauf bestehen können, im Falle eines unterbrochenen Downloads nicht in die Datenbank zu gehen, sollten Sie zumindest die integrierte .NET-Unterstützung verwenden, um Ihnen bei den kniffligen Bits zu helfen (z. B. IsolatedStorageFileStream).

    +0

    +1 für IsolatedStorageFileStream –

    1

    Es gibt keinen Grund, dass Schritt 2 zweimal zwei Minuten dauern muss. Während Sie die Datei herunterladen, können Sie sie auf dem Weg zur Datenbank durch Variablen im Speicher streamen.

    Sofern Sie keinen zwingenden Grund haben, eine Dateisystemkopie der Datei beizubehalten, würde ich in den meisten Fällen mit # 2 gehen.

    +0

    Sie haben recht, der erste nimmt 2 Schritte statt der zweite. –

    +0

    Ich habe es jetzt in der Frage korrigiert. –

    2

    Ich würde davon ausgehen, dass, wenn das Schreiben in die Datenbank wegen etwas im Inhalt der Datei fehlschlägt, es immer scheitern wird, egal wie oft ich versuche, den gleichen Inhalt in die Datenbank zu schreiben. In diesem Fall besteht die einzige Lösung darin, die Datei trotzdem zu reparieren und erneut herunterzuladen. Wenn das Schreiben in die Datenbank aufgrund eines Fehlers in der Datenbank fehlschlägt, treten größere Probleme auf, als wenn Sie die Datei erneut herunterladen müssen.

    Gehen Sie mit Option # 2.

    1

    Ich verstehe nicht die Qualifier, die Sie in Bezug auf die Zeiten hinzugefügt haben oder die Datei zweimal herunterladen müssen, aber wenn das System für den Speicher geschnallt wird, Zwischenspeicherung Ihres Downloads auf die Festplatte und dann an die DB senden kann wirklich Ihre einzige Option (vorausgesetzt, Ihr Datenanbieter kann einen Stream akzeptieren).

    EDIT: in der ursprünglichen Post beschreibt der Autor schreiben direkt in die Datenbank als zweistufige Prozess, die ich annehmen, um 1. Datei in eine Variable herunterladen, 2. Variable Inhalte in DB streamen. Wenn er in Option 2 direkt in die DB streamt, dann stimme ich zu, dass dies ein besserer Weg ist.

    +0

    Was meinst du mit geschnallt für Speicher? Direktes Schreiben in die Datenbank würde mehr Speicher verbrauchen? –

    +0

    Wenn das System z. B. 25 MB frei hat und Sie 45 MB Daten einfügen möchten, können Sie nicht alle Daten im Speicher speichern. Sie müssten sie auf Festplatte zwischenspeichern und dann in kleineren Blöcken an die Datenbank senden . Mit den Änderungen an Ihrer Frage stimme ich jedoch zu, dass Option 2 der bessere Weg ist. – overslacked

    +0

    Aber beim Streaming belegen die Daten immer noch 45MB? Wird nicht jeder Brocken verworfen, sobald er benutzt wird? –

    1

    Ich würde mit Option zwei gehen. Es sollte nicht sehr oft zu Fehlern kommen, und wenn Sie da sind, können Sie es einfach erneut herunterladen. Wenn Sie diese lokale Kopie aus irgendeinem Grund im Dateisystem haben müssen, dann laden Sie sie nicht herunter, speichern Sie sie, lesen Sie sie und senden Sie sie an die Datenbank ... einfach herunterladen und zur gleichen Zeit an die Datenbank senden wie im Dateisystem .

    +0

    Ich frage mich, wie es zu implementieren, wie in. NET Ich müsste den Inhalt in den Speicher zu speichern, um es an 2 Stellen schreiben –

    +0

    Sie können von Ihrem StreamReader lesen und schreiben Sie dann auf mehrere StreamWriters. –

    3

    Wenn die erhöhte Latenz Sie nicht wirklich umbringt, würde ich normalerweise Option 1 wählen, es sei denn, Sie haben einen guten Grund, die Daten im Dateisystem nicht zu verwenden (z. B. Bedenken hinsichtlich Sicherheit, Kapazität, ...).

    Oder vielleicht Option 3 as suggested by Max Schmeling, in das Dateisystem gleichzeitig mit dem Schreiben in die Datenbank zu speichern.

    Speicherplatz ist billig, und es ist oft nützlich, eine Sicherungskopie der heruntergeladenen Daten zu haben (z. B. um Änderungen an Ihrem Datenbank-Schreibcode als Beweis für den Inhalt heruntergeladener Daten zu testen ...).

    +0

    +1 für das Gehen gegen den Fluss –

    1

    Ich würde Option 3 wählen. Speichern Sie es auf der Festplatte und speichern Sie den URI in der Datenbank. Ich war nie ein Fan von Speichern von Dateien in einer Datenbank.

    +0

    In meinem Fall wird die Datei (XML) nicht in der DB gespeichert, aber seine geparsten Daten sind. –

    +1

    Warten Sie, aber wenn Sie die Daten analysiert haben, dann haben Sie es im Speicher, also ist die Frage dann irrelevant, nicht? – Quibblesome

    +0

    Nein, es ist nicht irrelevant. Ich verstehe deinen Standpunkt nicht. –

    1

    Ich würde für eine bisher noch nicht erwähnte Option (außer in Kommentaren vielleicht) gehen, die im Thema von my blog post about blobstreams erwähnt wird: Einrichten einer Verarbeitungs-Pipeline von Streams, die das Herunterladen und Interpretieren der Datei, die Sie benötigen, kümmern. Verwenden Sie dann Code, um interpretierte Datensätze aus diesem Compound-Stream zu lesen, und führen Sie die erforderlichen Einfügungen/Aktualisierungen in Ihrer Datenbank innerhalb einer Transaktion durch (pro Datei/pro Datensatz gemäß Ihren funktionalen Anforderungen).

    Diese Art von Szenario ist, wo Stream basierte Klassen übertreffen. Es würde bedeuten, dass Sie niemals die gesamte Datei während der Verarbeitung irgendwo auf der Festplatte oder im Speicher haben. Wie Sie erwähnten, dauert das Herunterladen der Datei Minuten, sie könnte groß sein. Kann Ihr System die Zwischenspeicherung der gesamten Datei übernehmen (vielleicht mehr als einmal: Speicher und Festplatte)? Selbst wenn mehrere Dateien gleichzeitig verarbeitet werden? Wenn Sie in der Praxis herausfinden würden, dass die Kette nicht zuverlässig genug für Sie ist und Sie die heruntergeladene Datei vorübergehend auf der Festplatte speichern möchten und in der Tat die Verarbeitung wiederholen möchten, ohne sie herunterladen zu müssen es ist wieder so einfach. Alles, was benötigt wird, ist eine extra Stream in der Pipeline, die prüfen würde, ob die benötigte Datei bereits in Ihrem "bereits heruntergeladenen Dateien" -Cache (in irgendeinem Ordner, in isoliertem Speicher, was auch immer) ist und die Bytes zurückgibt, anstatt tatsächlich a Herunterladen von Stream in Ihre Verarbeitungspipeline.