20.000 File filtern

Status
Nicht offen für weitere Antworten.

SaschaLR

Bekanntes Mitglied
Hallo!

Ich habe ein Performance-Problem.

Ich muss aus 4 Verzeichnissen ca. 20.000 Files filtern. Das ganze in 2 Stufen, zuerst nach Datum und dann nach dem Namen. Filtern heisst in dem Zusammenhang, dass nur Files die ein bestimmtes Datum haben und deren Name bestimmte Kriterien erfüllt, in eine ArrayList übernommen werden.

Ich bin grade beim Datumsfilter, der in Form einer JComboBox vorliegen wird und ein Datum nur dann enhält, wenn mind. eine Datei mit diesem Datum gefunden wurde.

Mein Problem ist, dass es ziemlich lange Dauert die 20.000 File zu durchforsten. Ich hoffe jemnd kann mir einen Tip geben, wie es schnel lwerden könnte.

Code:
public static HashSet<String> loadData(ArrayList<File> folders) {
	HashSet<String> temp = new HashSet<String>();
	String date = null;
	for (File folder : folders) {
		for (File file : folder.listFiles()) {
			date = sdf.format(file.lastModified());
			temp.add(date);
		}
	}
	return temp;
}

Kurze Erklärung:
- sdf ist ein SimpleDateFormatter("yyyyMMdd")
- folders enthält die 4 Verzeichnisse
- temp soll am Ende jedes Datum einmal enthalten.

Ich hatte überlegt, ob ich nicht auf diese Idee ganz verzichte und einfach jedes Datum als Filter zulasse und ggf. eine leere Liste anzeige wenn es keine Dateien zu dem Datum gibt. Leider ergab das auch keine bessere Performance, weil ich dann in meinem FileFilter jede Datei einmal anfassen und im Prinzip die selben Operationen wie oben damit ausführen musste.

Hat jemand eine Idee? Gibt es schon eine Lösung in der Java-API auf die ich nur nicht gekommen bin? Sowas wie einen fertigen Datums-Filter für Dateien oder so?

Dank und Gruß,
Sascha
 
M

Mario_H

Gast
Was, wenn du die Dateien nach Datum sortiert einmal einliest (dauert auch lange, einmal) und danach diese sortierte Liste verwendest, müsste dann nach dem ersten einlesen deutlich schneller gehen.
 

Kola

Aktives Mitglied
Du filterst ja nach 2 Kriterien. Dann sollte man immer (bei Kenntnis der Anwendungsdomäne) die Filterung, die die Resultatmenge am meisten einschränkt, zuerst ausführen.

Allerdings würde ich mir üblerlegen, ob ich nicht schnell einen Systembefehl ("ls" oder "dir") ausführe, der die ganze Filterung erledigt.
 

SebiB90

Top Contributor
übergib doch listFiles() nen FileFilter, dann bekommste nur die dateien die du auch willst und musst nicht nachträglich nochmal filtern ;)
 

SaschaLR

Bekanntes Mitglied
@SebiB90 hab ich ja shcon versucht, siehe Posting

@Mario_H genau das tue ich bereits

@Kola so einfach ist das leider nicht, da zur Laufzeit die beiden Filterkriterien ständig geändert werden. Für ein bestimmtest Datum kann der 2. Filter schnel langepasst werden. Das ist dann auch kein Problem mehr. Aber die Idee mit dem 'ls' ... bzw 'dir' ist garnicht schlecht... mal sehen...

Das Problem ist wirklich, dass ich einmal alle 20.000 Dateien anfassen muss. Wäre eben schön, wenn es schon eine API-Funktion gäbe die irgendwie mit dem FS zusammenarbeitet und sich zB nur Dateien vom xx.yy.zzzz geben lässt ... ohne Java-FileFilter ...
 
M

Mario_H

Gast
Wenn du die Dateien schon nach Datum sortiert in einer Liste hast stimmt das aber nicht:

Ich hatte überlegt, ob ich nicht auf diese Idee ganz verzichte und einfach jedes Datum als Filter zulasse und ggf. eine leere Liste anzeige wenn es keine Dateien zu dem Datum gibt. Leider ergab das auch keine bessere Performance, weil ich dann in meinem FileFilter jede Datei einmal anfassen und im Prinzip die selben Operationen wie oben damit ausführen musste.
[/b]
 

SaschaLR

Bekanntes Mitglied
Ja, aber das sortierte Einlesen erspart mir das lange lange Warten nicht. Darauf wollte ich eigentlich hinaus.

Sicher, wenn ich einmal nachdem Datum sortiert habe geht alles was danach kommt schön fix, aber das einmalige Einlesen und sortieren dauert dennoch ewig. ... genauso habe ich es ja von Anfang an gemacht...

Was mir eben viel ersparen würde wäre sozusagen ein Aufruf der eben nur die Dateien vom xx.yy.zzzz zurückgibt. Ohne dass ich in meinem Code einen FileFilter mit der Funktion laufen lassen muss.
 
M

Mario_H

Gast
Was meinst du mit lange? Ich tipp auf ca. eine Minute, eher weniger... ?

Das muss beim Programmstart ja nur einmal geschehen...

Warum sollte besagter Aufruf so viel schneller arbeiten als dein FileFIlter?


Vielleicht dauert das einlesen so lange, weil du eine ungeeignete Datenstruktur verwendest bzw. die Startgröße schlecht gesetzt ist..
 
M

Mario_H

Gast
p.s. mach mal suchen *.* [geändert am ...] in deinen Ordnern mit dem Windows-Explorer. So lang dauert es mindestens, so oder so.
 

SaschaLR

Bekanntes Mitglied
Mit lange meine ich >30 Sekunden ... allerdings kann die Liste auf Knopfdruck aktualisiert werden ... d.h. je Klick auf "Aktualisieren" > 30 Sekunden ...

Und wer bitte benutzt denn den Explorer? Sowas hab ich garnicht :) Bei mir im Finder geht's in Windeseile ... aber das nur als Scherz am Rande :)
 
G

Gast

Gast
Hi,
egal was du machst, einmal musst du mindestens über alle Dateien rüber. Das dauert natürlich schon mal ein wenig. Die Sache ist, dass dein Momentaner Weg nicht sehr schön ist. Du verwendest eine Struktur, die nicht nötig ist : Strings. Nicht dass Strings nicht schön sind, aber schnell ist doch eher etwas anderes. Dein Datum wird als Long geliefert. Dein Hauptproblem ist also, dass du hier long Werte hast, die dir zu genau sind (du möchtest nur auf den Tag genau).
Eine Möglichkeit wäre es, statt umständlich einen String zu erstellen das Datum als Date zu parsen (also ein HashSet<java.util.Date> zu verwenden).
Das ist zwar noch nicht die optimale Lösung, aber das unnötige Erzeugen eines Strings fällt weg. Letztlich wird etwas ähnliches sihcherlich auch gemacht bevor der String fertig ist.
Zudem sollte der Vergleich zwischen zwei Daten auch noch schneller sein als der eines String. Ein long dürften ja so ca. 64 Bit + 1 VZ Bit sein. Bei einem String der Form yyyymmdd hast du schon die doppelte Menge für den Inhalt + den Overhead des Strings (natürlich hat auch ein Date Overhead!)
Das ganze als long wäre noch interessant. Der letzte Zugriff ist ja so weit ich mich da nicht irre nur die Anzahl der Millisekunden seit einem festen Datum. Hier kannst du ja leicht ausrechnen, wie du nur auf ganzzahlige Tage kommst. Dann musst du nur noch longs speichern, dass dürfte noch ein wenig bringen.
Ganz schlecht ist es wohl auch, dass du ein Hashset verwendest ohne hier die Initialgröße zu verändern. Ein Hashset muss natürlich bei jeder Größenänderung ein Rehashing durchführen. Das kostet natürlich Zeit. Gibst du keine Startgröße an, dann wird ein Set mit 16 Elementen angelegt und bei 75% Füllung wird dies vergrößert. Da bin ich mir jetzt nicht sicher, wieviel größer es wird, aber wahrscheinlich kommen einfach 16 Elemente hinzu...
Initialiesiere es einfach mit einer Größe, die für dich wahrscheinlicher ist. Keine Ahnung wieviele verschiedene Daten du hast, aber musst du halt abschätzen (und im Konstruktor übergeben). Wird weniger Rehashing nötig, dürfte das ein wenig Zeit ausmachen. Du solltest natürlich auch daran denken, dass ein unheimlich großer Wert auch unheimlich viel Speicher braucht, also schon einen sinnvollen Erwartungswert nehmen!

Ja, versuch es mal mit den Änderungen, vielleicht merkst du ja schon einen Unterschied!
 
G

Gast

Gast
Ahso, du kannst natürlich die Differenz zu einem festen Datum (z.B. wie das von java.util.Date) auch direkt in Tagen in das HashSet packen.
Dann würdest du schon mit int auf über 5 Mio Jahre kommen (was aber nur noch 32 Bit sind und damit weniger Speicher + Registerbreite!)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
D Read JSON File Problem Allgemeine Java-Themen 9
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
Cromewell JavaFX FXML-File lädt unter Ubuntu nicht Allgemeine Java-Themen 7
D Java Anwendung mit dll File Allgemeine Java-Themen 5
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
J Properties file ändern Allgemeine Java-Themen 12
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
B Objekte anhand von Properties file Allgemeine Java-Themen 41
Dechasa Input/Output Write into File Allgemeine Java-Themen 2
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
C Input/Output Problem bei Datei verschiebung mit File.move und Paths.get() Allgemeine Java-Themen 26
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
M Desktop jar File icon Ändern? Allgemeine Java-Themen 14
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
Thallius Custom File Chooser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
J Java Download Filedownload File.getFileName Allgemeine Java-Themen 3
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
S runnable jar file in Verbindung mit itext Allgemeine Java-Themen 3
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
F File.listFiles ohne .sort Allgemeine Java-Themen 6
B XML File JAXB Allgemeine Java-Themen 0
S Platzverbrauch, File oder String Allgemeine Java-Themen 14
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P java.nio.file unter Java 6 verwenden Allgemeine Java-Themen 4
A TXT File einlesen unterschiedliche Zeilenlänge Allgemeine Java-Themen 9
B Finde letztes veränderte File Allgemeine Java-Themen 4
E Zip-File entpacken: unterschiedlicher Zeitaufwand bei unterschiedlicher Puffergröße Allgemeine Java-Themen 2
Guybrush Threepwood File.canWrite() und UAC Allgemeine Java-Themen 7
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
V C-Header Datei aus .java File herstellen Allgemeine Java-Themen 10
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
T @NotBlank verwendet nicht message aus .property-File Allgemeine Java-Themen 4
G Jar-File soll eignen *.jar Namen ausgeben Allgemeine Java-Themen 10
S Jar-File startet nicht über doppelklick Allgemeine Java-Themen 2
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
V ProcessBuilder exe file Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
M File einlesen während es beschrieben wird.. Allgemeine Java-Themen 6
B File umbennen ohne Extension zu aendern Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben