Finden Sie die 3 zuletzt geänderten Dateien in einer langen Liste von Dateien
Ich habe eine Datei in der Liste, die möchte ich Sortieren und extrahieren Sie die top 3 der letzten änderung.
Einschränkung: ich kann nicht mit Java 7 aufgrund von Kompatibilitätsproblemen auf den downstream-apps
Meine aktuellen Optionen
Lösung 1
File[] files = directory.listFiles();
Arrays.sort(files, new Comparator<File>(){
public int compare(File f1, File f2)
{
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
} });
Lösung 2
public static void sortFilesDesc(File[] files) {
Arrays.sort(files, new Comparator() {
public int compare(Object o1, Object o2) {
if ((File)o1).lastModified().compareTo((File)o2).lastModified()) {
return -1;
} else if (((File) o1).lastModified() < ((File) o2).lastModified()) {
return +1;
} else {
return 0;
}
}
});
}
Problem
Den beiden oben genannten Lösung mehr Zeit braucht, um auszuführen, & Speicher. Meine Datei Liste besteht aus rund 300 tar-Dateien mit 200MB Größe jeder. so ist es verbraucht mehr Zeit & memory.
Gibt es irgendeinen Weg, um effizient zu handhaben?
Jeder Vergleichsoperation wird ein file-Objekt, das von hohen Speicher, ist es eine Möglichkeit, den Speicher freizugeben, und behandelt diese effektiv?
- Ich denke, dass Ihr Speicher-und timing-Probleme werden nicht durch Ihre Sortierung von 300 items (die im Speicher sind, sowieso). Vielleicht sind Sie in der Durchführung der Sortierung mehr als einmal?
- Nope, ich bin über eine der beiden oben genannten Lösungen. was du meinst mit dem "in Erinnerung sowieso" wie kann ich klar, dass sobald die operation abgeschlossen.
- Ein
File
Objekt ist nicht eine teure Objekt! Es enthält nur den Dateinamen, nicht den Inhalt der Datei. Also die Größe der Datei ist völlig irrelevant.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies viel schneller tun.
Arrays.sort(...) verwendet "schnellen Sorte", die ~ n * ln(n) Operationen.
Diesem Beispiel wird nur eine iteration durch das gesamte array, die ~ n Operationen.
Einer kleinen Anzahl von Dateien, die Sie nicht sehen, viel Unterschied, aber selbst bei zig Dateien ist der Unterschied wesentlich, für größere zahlen - dramatisch.
Den code zu überprüfen, den Algorithmus (setzen Sie bitte in einem korrekten Dateien-Struktur):
Müssen Sie die lastModified jeder Datei, die Sie nicht ändern können, dass. Was Sie nicht tun müssen, ist zu Sortieren alle Elemente, nur um mit den top-3. Wenn Sie verwenden können, Guave, Sie könnte verwenden Mit der Bestellung.greatestOf (die verwendet einen guten Algorithmus):
Ich bin für Lösung 1, mit einigen Verbesserungen
zur Vermeidung unnötiger Objekte der Schöpfung, weil der Lange.valueOf(long).
File
nicht halten /Lesen, Datei-Daten, sondern nur den Pfad der Datei, gibt es keine performance /Speicher-Problem mit es. Den nur zeitaufwändiger Vorgang hier liest das änderungsdatum von Datei-system, die nicht vermieden werden können.Dein problem ist, dass das abrufen des Datums der letzten änderung ist eine relativ teure operation, da es sich um Betriebssystem-Logik. Also, wenn Sie nichts dagegen haben, um die neuesten up-to-date-Werte, könnten Sie wickeln Sie Ihre Dateien in einer vergleichbaren Klasse.
Beachten Sie, dass eine änderung des Datums der letzten änderung während Ihre Sortierung wird nicht definiertes Verhalten zur Folge, die für viele Sortier-algorithmen. Java-7s Tim Sortieren Umsetzung, wird eine Ausnahme ausgelöst, wenn ein Datum der letzten änderung ändert und damit Vergleiche andere Werte ergeben.