Ich muss 6 Millionen Dateien ablegen, die ungefähr 100-200 Zeichen enthalten, und es ist schmerzhaft langsam. Der eigentliche langsame Teil ist das Schreiben der Datei, wenn ich diesen Teil kommentiere (der Aufruf der WriteSoveraFile-Methode), läuft das Ganze in 5-10 Minuten ab. So lief es über Nacht (16 Stunden) und wurde mit 2 Millionen Platten erledigt.
Gibt es eine schnellere Methode?
Wäre es besser, ein Array von Arrays zu erstellen und dann alles auf einmal zu speichern? (Mein System hat nur 4 GB, würde es nicht an den 6 GB Daten sterben, die dadurch verbraucht werden?)
Hier ist die Vorgehensweise:
%Vor%Dies ist mit ziemlicher Sicherheit ein OS-Dateisystemproblem; viele Dateien zu schreiben ist einfach langsam. Ich empfehle einen Vergleichstest in der Shell und in C zu schreiben, um eine Vorstellung davon zu bekommen, wie viel das Betriebssystem beiträgt. Zusätzlich würde ich zwei wichtige Verbesserungen vorschlagen:
FileWriter
kann bei der Operation close()
blockieren. (Ich wollte vorschlagen, NIO zu betrachten, aber die APIs scheinen für Ihre Situation keinen großen Nutzen zu bieten, da das Einrichten eines mmapped-Puffers wahrscheinlich mehr Overhead verursachen würde, als es für diese Größe sparen würde.)
Sie können nio
package verwenden. Es ist schneller als io
. Schau mal: Ссылка
Vorteile von NIO:
1. Puffer-orientiertes
2. Nicht blockierende IO
Da es nicht blockierend ist, können Sie eine Datei erstellen, Daten darauf schreiben und sie wird in einem Puffer gespeichert. Ihre Anwendung kann dann zur nächsten Datei weitergehen, Daten in den Puffer schreiben und so weiter und so fort. Das bedeutet, dass Sie nicht warten müssen, bis die Daten tatsächlich geschrieben sind, bevor Sie fortfahren.
Dadurch sparen Sie viel Zeit bei Millionen von Dateien. Also selbst wenn es dir eine viertel Sekunde spart, multipliziere es mit einer Million und mach die Mathematik =)
Wie bereits erwähnt, ist Ihr begrenzender Faktor der Speicherzugriff, nicht Ihr Code oder die JVM. Es gibt ein paar Dinge in Ihrem Code, die Code verbessert werden, aber die Änderungen würden unbemerkt bleiben, da der zugrunde liegende Engpass die Datei IO ist.
Es gibt einige Möglichkeiten, den Prozess zu beschleunigen:
Verwenden Sie keinen BufferedWriter. Verwenden Sie die write () -Methode der FileWriter-Klasse.