Platzverbrauch, File oder String

Hallo

Ich programmiere gerade ne art Datei-Suchmaschine für meinen PC sowie die im Netzwerk verbundenen Laufwerke (ich weiß, gibt schon viele, jedoch will ich dies für mich speziell anpssen)

Da kam mir die Frage, was weniger platz braucht:
das File-Object, das wird ja einen haufen Platz brauchen, wenn ich für jede gelesene Datei einen Eintrag brauche, oder einfach den kompletten Pfad in ein String-Object ? Daraus kann ich ja weiterarbeiten.
Beim String bräuchte ich dann noch die Größe und das letzte Speicherdatum (zumindest für den Anfang).

Wie viel Platz braucht ein File-Object ?? (vermutlich abhängig von Pfadlänge usw.)

Aufbauen würde ich dies als linkedlist, da ich beim suchen sowieso immer alle durchsuchen muss.

Habt ihr da rigendwelche Tipps oder erfahrungen für mich ?

Danke, S.
 
Da kam mir die Frage, was weniger platz braucht:
Mit solchen Fragen solltest Du Dich erst beschäftigen, wenn Du tatsächlich Probleme mit dem Speicher hast, und dann auch erst, wenn Du mittels Profiling festgestellt hast, dass [JAPI]File[/JAPI] tatsächlich die Ursache ist.

Es gibt keinen Grund [JAPI]File[/JAPI] durch ein eigenes Konstrukt auf basis einen kodierten String nachzubauen.

bye
TT
 
File ist auch überraschend leere Klasse, enthält nur intern einen String,

mit hunderttausenden Dateien kann man sicherlich den Standard-Arbeitsspeicher beanspruchen,
spätestens mit zugewiesenen GB aber dann doch eher schwer

wenn überhaupt gibt es Datenbanken zum effizienten Vorhalten großer Datenmengen mit Suche usw.
 
Besten dank.

hatte dies schon mal in VBA über SQL programmiert, und versuche da nun über java.
Datenbank oder verteiltes rechnen kommt vielleicht später noch dazu.
 
Hi

Ich habe noch eine Frage zum File-Objekt

Mir ist aufgefallen, daß ein paar Routinen ziemlich lange dauern, wie z.b. .isDirectory()
Wird da erst bei der Anfrage geprüft, ob dies ein Ordner ist oder schon bei der Instanzierung ???

Die Filegröße wird ja immer beim aufruf der instanz neu eingelesen, hmmm, dauert bei vielen Files am Netzwerk sehr lange :-(
 
Zuletzt bearbeitet:
Was heisst ziemlich viel Zeit?
Gut möglich, dass diese Daten lazy initialisiert werden. Warum schaust du nicht einfach den Quellcode an? Ich behaupte, dass in [c]public abstract int getBooleanAttributes(File f);[/c] das Lazy Init passiert.
 
im Netzwerk kann alles lange dauern, File über Betriebssystem, DB-Zugriff, sonstiger Programmaufruf,
das muss mit Java, Entscheidung String, File, DB usw. nicht unbedingt etwas zu tun haben

allerdings kann es sich schon anbieten statt auf vielleicht 100 Files einzeln langsam zuzugreifen
auf anderen Rechner jemand zu haben der sich um alles kümmert (dort normal schnell) und nur 1x auf Ergebnis-Nachricht zu warten
 
hmm, ja, die verteilte programmierung kommt noch, auch SQL hab ich derzeit keinen zugriff,, kommt vielleicht auch noch.

Ich versuche jetzt (zum ersten mal) eine Bestehende Klasse (File) zu erweitern, und weitere Daten zu speichern, da ich noch viel mehr auswertungen mache, und nun dauerts dann schon ne weile.

Es geht hier (für denAnfang) mal um ca. 250k Files auf dem netzlaufwerk.

Danke wiedermal !
 
hmm, ja, bedeutet für mich aber eine viiiel längere Laufzeit.

habe jetzt die Klasse File1 angelegt, abgeleitet von File, wo ich die eine oder andere Methode umschreibe, sodaß nicht jedesmal geprüft wird.

Ich konnte es überall, bis auf eine zeile umschreiben, hier bekommeich weiterhin den Fehler "Type mismatch: cannot convert from element type File to File1"

Hier ein Codeauszug:
Java:
		File1 dir = new File1(Laufwerk);

		for (File1 Dateielement : dir.listFiles()) { // <<-- Hier liegt der Fehler bie dir-listfiles()
				if (Dateielement.isFile()){
					filelist.add(Dateielement);
				}
				if (Dateielement.isDirectory()){
					Ordner_noch_einzulesen.add(Dateielement);
					filelist.add(Dateielement);
				}
			}

Ich habe dir als File1 angelegt, warum will er unbedingt bei .listFiles das File-objekt ??
 
wie sieht denn File1 aus, hast du listFiles() überschrieben und erzeugst File1-Objekte?
ansonsten macht File selber Arbeit und wird gewiss nicht File1-Objekte erzeugen,
es kommen File-Objekte heraus

nur eine Klasse zu schreiben ändert nicht automatisch auf magische Weise alles
 
wie sieht denn File1 aus, hast du listFiles() überschrieben und erzeugst File1-Objekte?
ansonsten macht File selber Arbeit und wird gewiss nicht File1-Objekte erzeugen,
es kommen File-Objekte heraus

nur eine Klasse zu schreiben ändert nicht automatisch auf magische Weise alles

Danke, hat mir geholfen, zumindest bei der einen Methode, dafür jetzt bei einer anderen:

Die Methode listFiles hab ich in der File1-Methode überschrieben auf das Objekt File1
Jetzt will ich die Roots auslesen, nur die ist statisch, bekomme eine Fehlermeldung erst während der Laufzeit, er kann die nicht Casten

Java:
	@Override
	public File1[] listFiles() {
		return (File1[]) super.listFiles();
	}
	
	public static File1[] listRoots(){
		return (File1[]) File.listRoots();
	}

wie komme ich hier an meine statische Methode ???:L

Hoffe beim listFile bin ich am richtigen weg, konnte es ja auch noch nicht testen.
 
Casten bewirkt dahingehend nichts,
wenn du File1-Objekte haben willst, dann muss auch irgendwo irgendwer File1-Objekte erstellen, also viele

einfach zu bedenken

du musst schon
Java:
    public File[] listFiles() {
	String[] ss = list();
	if (ss == null) return null;
	int n = ss.length;
	File[] fs = new File[n];
	for (int i = 0; i < n; i++) {
	    fs[i] = new File(ss[i], this);
	}
	return fs;
    }
komplett überschreiben, genau den gleichen Code ausführen und statt 'new File' eben 'new File1'-Objekte erzeugen,
das Array auch vom richtigen Typ erstellen,
+ Rückgabetyp ändern, was aber nicht ganz zwingend ist wenn etwa manschmal durch Interface vorgeben

falls File1 von File erbt und File1[] erzeugt wurde und richtig befüllt,
dann kann es tatsächlich im Programm nötig und sinnvoll sein, irgendwo File[] auch auf File1[] zu casten

----

oftmals hat man nicht die Möglichkeit oder es wäre unschön, den kompletten Code selber zu kopieren/ zu ändern,

grundsätzlich gibt es dann als alternatives Vorgehen, das File[] normal erstellen zu lassen, in der überschriebenen Methode z.B. mit super.listFiles(),
dann aber immer noch ein neues Array zu erzeugen und jedes einzelne normale File-Objekt durch ein eigenes zu wrappen/ ersetzen

das dürfte für die statische Methode nötig sein
 
so, hab jetzt einiges umgeschrieben und in die Klasse implementiert.
Funktioniert, nur mit der Geschwindigkeit bin ich noch nicht ganz zufrieden.

mal schauen, wann ich euch erneut um Hilfe anbettle

lg S.
 

Neue Themen


Zurück
Oben