Xojo Conferences
MBSOct2019CologneDE

Re: StackOverflowException (Real Studio network user group Deutschland Mailinglist archive)

Back to the thread list
Previous thread: Datumabfrage automatisieren
Next thread: Listbox erkennt eingabe nicht ??


Re: StackOverflowException   -   Stefan Mettenbrink
  Re: StackOverflowException   -   Thomas Tempelmann
  Re: StackOverflowException   -   Stefan Mettenbrink
  Re: StackOverflowException   -   Thomas Tempelmann
   Re: StackOverflowException   -   MGE Lists
    Re: StackOverflowException   -   Christian Schmitz
    Re: StackOverflowException   -   Stefan Mettenbrink
    Re: StackOverflowException   -   Stefan Mettenbrink
    Re: StackOverflowException   -   Christian Schmitz
    Re: StackOverflowException   -   Stefan Mettenbrink
    Re: StackOverflowException   -   Christian Schmitz
    Re: StackOverflowException   -   Stefan Mettenbrink
    Re: StackOverflowException   -   Stefan Mettenbrink
    Re: StackOverflowException   -   Christian Schmitz
    Re: StackOverflowException   -   Thomas Tempelmann
    Re: StackOverflowException   -   Stefan Mettenbrink
   StackOverflowException   -   Stefan Mettenbrink

Re: StackOverflowException
Date: 04.09.11 18:26 (Sun, 4 Sep 2011 19:26:18 +0200)
From: Stefan Mettenbrink
Thomas Tempelmann wrote:

>>       DateienZusammensuchen(f.Item(i))
>
> Aha, da liegt der Hase im Pfeffer. Hast Du meinen ersten Kommentar
> nicht gesehen? Der hat genau dies schon vermutet.

...
Mist, stimmt :-(
Ich habe mich wohl irritieren lassen, da ich mir sicher war, auf Alias
zu testen. Allerdings an anderer Stelle.
...
Sieht gut aus. Ich denke, das war es. Danke.

MfG, Metti.

Re: StackOverflowException
Date: 04.09.11 17:46 (Sun, 4 Sep 2011 18:46:16 +0200)
From: Thomas Tempelmann
>       DateienZusammensuchen(f.Item(i))

Aha, da liegt der Hase im Pfeffer. Hast Du meinen ersten Kommentar
nicht gesehen? Der hat genau dies schon vermutet.

--

Re: StackOverflowException
Date: 04.09.11 17:35 (Sun, 4 Sep 2011 18:35:44 +0200)
From: Stefan Mettenbrink
Thomas Tempelmann wrote:

> Also wirst du wohl eher einen Fehler in deinem Algo haben. Und den
> können wir nicht riechen. Also herzeigen.

Gern:

Sub DateienZusammensuchen(f as folderitem)
dim i,j,k,bis as integer
dim gefunden as Boolean

bis=f.Count

for i=1 to bis

if f.Item(i)<>nil then
if f.Item(i).Directory=False then
if f.item(i).Alias=false then
Dateien.Append f.Item(i)
Namen.Append f.Item(i).DisplayName+"#"+Str(Anz)
Anz=Anz+1
end
else
DateienZusammensuchen(f.Item(i))
end
end
next

End Sub

MfG, Metti.

Re: StackOverflowException
Date: 04.09.11 17:14 (Sun, 4 Sep 2011 18:14:07 +0200)
From: Thomas Tempelmann
> Kann ich den Stack irgendwie vergrößern?
> Liegt doch noch irgendwo ein Fehler vor?

Also, es ist doch sehr sehr unwahrscheinlich, daß du einen SO
bekommst, wenn du einfach nur rekursiv durch eine Ordnerstruktur
gehst, weil die Tiefe selten mehr als 10, geschweige denn 20 ist, was
immer noch jede Menge Platz beläßt.

Also wirst du wohl eher einen Fehler in deinem Algo haben. Und den
können wir nicht riechen. Also herzeigen.

--
Th

Re: StackOverflowException
Date: 03.09.11 16:03 (Sat, 3 Sep 2011 15:03:35 +0000)
From: MGE Lists
Du kannst den Stack nicht vergößern.
Ich glaube er hat eine Größe von 64 KB.

Du musst sicher Deine Routine zum abarbeiten der Strukturen
überdenken.

z.B.:
1. Durchforsten eines Ordners
2. Gefundene Dateien abarbeiten
2a. Gefundene Ordner in einem Array, DB, etc. zwischenbuffern und nach dem Ordner die gemerkten wieder mit 1. Verarbeiten.

Hierbei musst Du jedoch bedenken, das die Betriebssysteme auch
eine Beschränkung der offenen Filehandels haben.
Also sollten die zwischengebufferten Ordner keine File-Arrays sein.
Sicher wäre eine reine InMemory-SQLite Datenbank zum Sichern der Ordnerpfade
eine zu überlegende Sache. Wohl nicht ganz so schnell wie recursiv,
aber save.

Grüße
Thomas

-------- Original Message --------
Subject: StackOverflowException (03-Sep-2011 16:05)
From: Stefan Mettenbrink <<email address removed>>
To: <email address removed>

> Ich schreibe gerade an einem Tool, welches alle Dateien recursiv ab dem
> vorgegebenem Verzeichnis abarbeitet.
> Jetzt habe ich das Benutzerverzeichnis vorgegeben und bekomme bei gut
> 3.000.000 Dateien eine StackOverflowException.
>
> Kann ich den Stack irgendwie vergrößern?
> Liegt doch noch irgendwo ein Fehler vor?
>
> Ich wundere mich, dass es nicht möglich sein soll, eine ganze
> Festplatte recursiv zu durchsuchen.
>
> Wenn ich "nur" den Bilderordner des Benutzers durchsuchen lasse,
> funktioniert das Programm.
>
> MfG, Metti.
>

Re: StackOverflowException
Date: 04.09.11 18:26 (Sun, 4 Sep 2011 19:26:32 +0200)
From: Christian Schmitz

Am 04.09.2011 um 16:24 schrieb Stefan Mettenbrink:

> Wenn ich das richtig verstehe, wird UBound(folders) hier einen Wert 0
> zurückliefern und somit die while-wend-Schleife nicht durchlaufen.

Klar. Da muss >= hin. Ich hab's einfach runtergetippt ohne Fehlerkorrektur.

Gruß
Christian

--

Re: StackOverflowException
Date: 04.09.11 15:24 (Sun, 4 Sep 2011 16:24:59 +0200)
From: Stefan Mettenbrink
Christian Schmitz wrote:

> in etwa so:
>
> Sub Walk(folder as FolderItem)
> dim folders() as FolderItem
>
> folders.Append folder
>
> while UBound(folders)>0

Wenn ich das richtig verstehe, wird UBound(folders) hier einen Wert 0
zurückliefern und somit die while-wend-Schleife nicht durchlaufen.

Zumindest waren meine Versuche nicht erfolgreich. Auch fehlt der
recursive Aufruf der Routine. Oder möchtest Du etwas ganz anderes
damit bezwecken?

MfG, Metti.

Re: StackOverflowException
Date: 04.09.11 13:18 (Sun, 4 Sep 2011 14:18:36 +0200)
From: Stefan Mettenbrink
Christian Schmitz wrote:

>> Bei mir kommt es dann irgendwann zum StackOverflow. Würdest Du das bei
>> Deiner Variante ausschließen?
>
> ja.

Dann ist es einen Versuch wert :-)

>> BTW, unter Mac OS sind unsichbare Dateien nicht die mit . am Anfang?
>
> visible überprüft . und das Flag bei den Attributen soweit ich weiß.

Ah, OK. Zwei Fliegen mit einer Klappe.

Danke für die Tipps.

MfG, Metti.

Re: StackOverflowException
Date: 04.09.11 13:04 (Sun, 4 Sep 2011 14:04:16 +0200)
From: Christian Schmitz

Am 04.09.2011 um 12:27 schrieb Stefan Mettenbrink:

> Müsste es nicht 'if item=Nil then' sein?

ja.

> Bei mir kommt es dann irgendwann zum StackOverflow. Würdest Du das bei
> Deiner Variante ausschließen?

ja.

> BTW, unter Mac OS sind unsichbare Dateien nicht die mit . am Anfang?

visible überprüft . und das Flag bei den Attributen soweit ich weiß.

Gruß
Christian

--
Rea

Re: StackOverflowException
Date: 04.09.11 11:27 (Sun, 4 Sep 2011 12:27:07 +0200)
From: Stefan Mettenbrink
Christian Schmitz wrote:

> in etwa so:

Danke, schau ich mir an.

> Sub Walk(folder as FolderItem)
> dim folders() as FolderItem
>
> folders.Append folder
>
> while UBound(folders)>0
>
> dim currentFolder as FolderItem = folders.pop
>
> dim c as integer = folder.Count
> for i as integer = 1 to c
> dim item as FolderItem = folder.TrueItem(i)
>
> if item<>Nil then
> // no permission
> elseif item.Visible then // only visible

Müsste es nicht 'if item=Nil then' sein?

Ansonsten mache ich es fast genauso. Ich nutze nur For-Next Schleifen
und prüfe nicht auf Visible.
Bei mir kommt es dann irgendwann zum StackOverflow. Würdest Du das bei
Deiner Variante ausschließen?

BTW, unter Mac OS sind unsichbare Dateien nicht die mit . am Anfang?

Im Endeffekt soll die Routine doppelte Dateien raussuchen und ggf. zum
Vergleich anzeigen können (im Regelfall Bilder). Deshalb lasse ich
optional Dateien mit '._' am Anfang gleich unberücksichtigt.

MfG, Metti.

Re: StackOverflowException
Date: 04.09.11 09:03 (Sun, 4 Sep 2011 10:03:56 +0200)
From: Christian Schmitz

Am 03.09.2011 um 21:49 schrieb Stefan Mettenbrink:

> Wieso kommt dann durch den recursiven Aufruf der Durchsuchungsroutine
> der Stack Overflow? Nur Aufgrund der Menge an Unterordnern?

in etwa so:

Sub Walk(folder as FolderItem)
dim folders() as FolderItem

folders.Append folder

while UBound(folders)>0

dim currentFolder as FolderItem = folders.pop

dim c as integer = folder.Count
for i as integer = 1 to c
dim item as FolderItem = folder.TrueItem(i)

if item<>Nil then
// no permission
elseif item.Visible then // only visible

if item.Directory then
folders.Append item
else
// work with file here
end if

end if

next

wend
End Sub

und für Packete haben wir ja folderitem.isBundleMBS im Plugin.

Gruß
Christian

--

Re: StackOverflowException
Date: 03.09.11 21:52 (Sat, 3 Sep 2011 22:52:58 +0200)
From: Stefan Mettenbrink
Christian Schmitz wrote:

>> Ich sichere die benötigten Dateien in einem Array aus Folderitems.
>> Das ist also nicht sonderlich geschickt?
>
> doch, das sollte gehen.
>
>> Erzeugt ein Folderitem ein offenes File-Handle?
>
> nein

Mir fällt da noch etwas ein.
Wie ist es eigentlich mit den Dateien wie iPhoto Library. Das Paket wird
doch auch als Ordner behandelt und durchsucht. Oder die App-Bundles.
Kann ich das verhindern oder ist das kein Problem?

MfG, Metti.

Re: StackOverflowException
Date: 03.09.11 20:49 (Sat, 3 Sep 2011 21:49:06 +0200)
From: Stefan Mettenbrink
Christian Schmitz wrote:

>> Ich sichere die benötigten Dateien in einem Array aus Folderitems.
>> Das ist also nicht sonderlich geschickt?
>
> doch, das sollte gehen.
>
>> Erzeugt ein Folderitem ein offenes File-Handle?
>
> nein

Wieso kommt dann durch den recursiven Aufruf der Durchsuchungsroutine
der Stack Overflow? Nur Aufgrund der Menge an Unterordnern?

Wie umgehe ich das am sinnvollsten?
Soll ich die Verschachtelungstiefe mitzählen und ab einem Bestimmten
Wert die weitere Durchsuchung anschließend erneut für die
betroffenen Bereiche durchführen?

Wir wäre es lieber, den Stack zu vergrößern.

MfG, Metti.

Re: StackOverflowException
Date: 03.09.11 20:20 (Sat, 3 Sep 2011 21:20:18 +0200)
From: Christian Schmitz

Am 03.09.2011 um 17:12 schrieb Stefan Mettenbrink:

> Ich sichere die benötigten Dateien in einem Array aus Folderitems.
> Das ist also nicht sonderlich geschickt?

doch, das sollte gehen.

> Erzeugt ein Folderitem ein offenes File-Handle?

nein

Gruß
Christian

--

Re: StackOverflowException
Date: 03.09.11 17:29 (Sat, 3 Sep 2011 18:29:38 +0200)
From: Thomas Tempelmann
> Bisher arbeite ich ganz normal recursiv. Also wenn ein FolderItem ein Ordner
> ist, wird die Routine mit neuem Pfad erneut aufgerufen. Da dann für den
> Sprung in die Unterroutine Daten auf dem Stack abgelegt werden, vergrößert
> sicht der Stack dementsprechend.

Kann es vielleicht sein, daß du Aliasen folgst, weil du nicht
TrueItem() sondern Item() benutzt, und so in eine unendliche Rekursion
kommst?

--

Re: StackOverflowException
Date: 03.09.11 16:12 (Sat, 3 Sep 2011 17:12:43 +0200)
From: Stefan Mettenbrink
MGE Lists wrote:

> Du musst sicher Deine Routine zum abarbeiten der Strukturen
> überdenken.
>
> z.B.:
> 1. Durchforsten eines Ordners
> 2. Gefundene Dateien abarbeiten
> 2a. Gefundene Ordner in einem Array, DB, etc. zwischenbuffern und nach dem Ordner die gemerkten wieder mit 1. Verarbeiten.

Bisher arbeite ich ganz normal recursiv. Also wenn ein FolderItem ein
Ordner ist, wird die Routine mit neuem Pfad erneut aufgerufen. Da dann
für den Sprung in die Unterroutine Daten auf dem Stack abgelegt
werden, vergrößert sicht der Stack dementsprechend.

> Hierbei musst Du jedoch bedenken, das die Betriebssysteme auch
> eine Beschränkung der offenen Filehandels haben.
> Also sollten die zwischengebufferten Ordner keine File-Arrays sein.

Ich sichere die benötigten Dateien in einem Array aus Folderitems.
Das ist also nicht sonderlich geschickt?
Erzeugt ein Folderitem ein offenes File-Handle?

Das werde ich dann wohl mal überdenken müssen :-(

MfG, Metti.

StackOverflowException
Date: 03.09.11 15:05 (Sat, 3 Sep 2011 16:05:59 +0200)
From: Stefan Mettenbrink
Ich schreibe gerade an einem Tool, welches alle Dateien recursiv ab dem
vorgegebenem Verzeichnis abarbeitet.
Jetzt habe ich das Benutzerverzeichnis vorgegeben und bekomme bei gut
3.000.000 Dateien eine StackOverflowException.

Kann ich den Stack irgendwie vergrößern?
Liegt doch noch irgendwo ein Fehler vor?

Ich wundere mich, dass es nicht möglich sein soll, eine ganze
Festplatte recursiv zu durchsuchen.

Wenn ich "nur" den Bilderordner des Benutzers durchsuchen lasse,
funktioniert das Programm.

MfG, Metti.