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:
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%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):
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!
Math.NET Numerics ist nützlich für diese Art von Operationen.
Sollte schnell sein und einen kleinen Speicherbedarf haben.
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