C # - Textdatei mit Matrix - alle Einträge teilen

8

Ich habe eine Text Datei mit einer 1122 x 1122 Matrix von Niederschlagsmessungen. Jede Messung wird mit 4 Dezimalziffern dargestellt. Beispielzeilen sehen so aus:

0,0234 0,0023 0,0123 0,3223 0,1234 0,0032 0,1236 0,0000 ....

(und das 1122 Werte lang und 1122 Zeilen runter.

Ich brauche dieselbe Textdatei, aber mit allen Werten dividiert durch 6 . (Und ich muss das für 920 Dateien so machen ....)

Ich schaffte es, dies zu tun, aber in einem zweifellos unwirksamen ineffektiven und allumfassenden Gedächtnis:

  1. Ich öffne die Textdateien einzeln und lese jede Textdatei Zeile für Zeile
  2. Ich spalte jede Zeile in ein String-Array mit den separaten Werten als Mitglieder
  3. Ich gehe durch das Array, konvertiere jeden Wert in double, dividiere durch 6 und konvertiere das Ergebnis zurück in string, formatiert mit 4 Dezimalziffern und speichere als Mitglied in einem neuen String-Array.
  4. Ich verbinde das Array mit einer Linie
  5. Ich schreibe diese Zeile in eine neue Textdatei.
  6. Voila (nach einer Stunde oder so ...) Ich habe meine 920 neue Textdateien.

Ich bin mir sicher, dass es einen viel schnelleren und professionelleren Weg gibt, dies zu tun. Ich habe endlose Seiten über Matrix.Divide angeschaut, sehe aber dort keine Lösung für dieses Problem. Jede Hilfe wird geschätzt! Dies ist ein Code-Snippet, wie es für jede Datei verwendet wird:

%Vor%     
Yossi Beck 09.10.2016, 15:34
quelle

3 Antworten

4

Unter der Annahme, dass die Dateien wohlgeformt sind, sollten Sie im Wesentlichen in der Lage sein, sie zu einem Zeitpunkt zu verarbeiten, ohne dass Sie Arrays erstellen oder ein kompliziertes String-Parsing durchführen müssen.

Dieser Ausschnitt zeigt den allgemeinen Ansatz:

%Vor%

Sie würden eindeutig in einen (gepufferten) Dateistream statt in die Konsole schreiben.

Sie könnten wahrscheinlich Ihre eigene schnellere Version von ToString("F4") rollen, aber ich bezweifle, dass dies einen signifikanten Unterschied zu den Timings bedeuten würde. Wenn Sie jedoch vermeiden können, mit dieser Methode für jede Zeile der Eingabedatei ein neues Array zu erstellen, würde ich davon ausgehen, dass dies einen wesentlichen Unterschied macht. (Im Gegensatz dazu lohnt sich ein Array pro Datei als gepufferter Writer, besonders wenn es von Anfang an groß genug ist.)

Bearbeiten ( von Sani Singh Huttunen )
Entschuldigen Sie die Bearbeitung Ihres Posts, aber Sie haben absolut Recht Festkommaarithmetik wird in diesem Fall eine deutliche Verbesserung bringen.

Nach Einführung von StreamReader (~ 10% Verbesserung), float (weitere ~ 35% Verbesserung) und andere Verbesserungen (noch eine ~ 20% Verbesserung) (siehe Kommentare) dauert dieser Ansatz ~ 12 Minuten (Systemspezifikationen in meine Antwort):

%Vor%     
Matthew Strawbridge 09.10.2016 23:01
quelle
2

Sie öffnen / schließen die Ausgabe für jeden Wert, ich denke, wir können es besser machen! Ersetzen Sie es einfach durch diesen Code:

%Vor%

Für den Leseteil möchten Sie möglicherweise eine Zeile nach der anderen mit ReadLine() lesen, anstatt die gesamte Datei in einem großen Block zu lesen und dann im Speicher zu teilen. Dieser streaming -Ansatz wird die Speicherzuweisung stark reduzieren und auf der Hardware basieren (wie viel Speicher Sie haben, wie schnell Ihre Festplatten (HDD? SSD?) Sind) kann die Leistung auf sinnvolle Weise verbessern!

Lass mich bitte wissen, wie es jetzt funktioniert, ich bin sehr neugierig!

    
pid 09.10.2016 15:53
quelle
1

Math.NET Numerics ist nützlich für diese Art von Operationen.
Sollte schnell sein und einen kleinen Speicherbedarf haben.

%Vor%

Aktualisieren
Zeit, um 920 Dateien mit 1122x1122 doppelten Werten zu durchlaufen: ~ 43 Minuten.
Speicherbedarf: Max. 129 MB, Durchschnitt: 59 MB.
CPU-Auslastung: Max. 20%, Durchschnitt: 18%

Fazit ist, dass dies sehr I / O schwer ist und das ist die meiste Zeit.
Eine SSD oder besser RAIDED SSDs würden die Dinge beschleunigen.

Systemspezifikationen
HDD WD20EARS 5400 RPM
24 GB DDR3 @ 2133 MHz
Inte Core i7 950 bei 3,07 GHz

    
Sani Singh Huttunen 09.10.2016 16:59
quelle

Tags und Links