2010-04-01 9 views
8

Ich versuche besser zu verstehen, wann ich Iteratoren verwenden sollte und nicht. Wann immer ich eine potentiell große Datenmenge durchforste, schreibe ich einen Iterator dafür. Wenn es sich auch für die Iterator-Schnittstelle anbietet, dann scheint es wie ein Gewinn.Java - Wann sind Iteratoren zu verwenden?

Ich habe ein wenig gelesen, dass es viel Overhead mit einem Iterator gibt.

Ein gutes Beispiel für die Verwendung eines Iterators bestand darin, eine Reihe von SQL-Skripten zu durchlaufen, um jeweils eine Abfrage auszuführen, sie einzulesen und dann auszuführen.

Gibt es noch eine weitere Leistungsabnahme, auf die ich achten sollte? Bevor ich Iteratoren verwendet habe, habe ich den gesamten String von SQL-Befehlen gelesen, um ihn in eine ArrayList auszuführen, und die Iterationen durchlaufen. Wenn der Import ziemlich groß ist (wie bei Geolocation-Daten, neigt der Server dazu, stecken zu bleiben).

Walter

+0

Ziemlich gute Antwort bereits hier: http://StackOverflow.com/Questions/1879255/Traditional-For-loop-VS-iterator-in-Java – Zak

Antwort

9

Ich denke, Ihre Frage ist, wenn Sie Eingang "streamen" sollten, anstatt alles in den Speicher und den Prozess zu laden. Es ist nicht wirklich eine Frage der Verwendung Iterator oder nicht, denke ich.

"Es kommt darauf an", natürlich, obwohl es in Ihrem gegebenen Beispiel klingt wie Streaming der Eingabe, anstatt alles in den Speicher zu laden, ist ein klarer Gewinn, so iterieren tatsächlich. Der Vorteil des Ladens in den Speicher besteht normalerweise darin, dass der Code einfacher ist, und vielleicht profitieren Sie davon, dass große Blöcke gleichzeitig in den Speicher geladen werden, anstatt Bits gleichzeitig zu lesen. Der Vorteil von "Streaming" besteht darin, dass Sie Ihre Speicheranforderungen begrenzen und die damit verbundene Leistung erzielen.

Als eine sehr grobe Faustregel, würde ich nichts dergleichen in den Speicher laden, es sei denn, ich war sicher, dass es unter 100K oder so war.

+0

Vielen Dank für Ihre Eingabe - Ja, genau das ist es, woran ich dachte, und auch die Gültigkeit des Iterators.Ich mag es, verschiedenen Ansätzen ausgesetzt zu sein, um das gleiche Problem zu lösen. Beides wird funktionieren, da die Dateien immer größer werden, wird der Iterator effizienter und verbraucht nicht den gesamten Speicher des Servers. –

1

Ein gutes Beispiel, wo ich früher ein Iterator durch ein Bündel von SQL-Skripten iterieren war eine Abfrage zu einem Zeitpunkt auszuführen, es beim Lesen, Ausführen es dann.

In diesem Szenario wird der Overhead eines Iterators wahrscheinlich durch die Zeit, die zum Ausführen der Abfragen benötigt wird, in den Schatten gestellt.

Bevor ich Iteratoren verwendet habe, würde ich die gesamte Zeichenfolge von SQL-Befehlen lesen, um sie in eine ArrayList auszuführen, und die Iteration durch. Wenn der Import ziemlich groß ist (wie bei Geolocation-Daten, neigt der Server dazu, stecken zu bleiben).

Gibt es einen besonderen Grund, dass Sie alle in einer ArrayList sammeln müssen? Sie könnten sie einfach nacheinander ausführen, während Sie die Anweisungen lesen.

Iteratoren eignen sich besonders zum Streamen von Fällen, in denen die Daten im laufenden Betrieb geladen/erstellt werden. Sie benötigen nicht, dass die Daten vollständig im Speicher gespeichert sind.

+0

Ich verwendete eine ArrayList zu dieser Zeit, weil ich die Reihenfolge halten musste und Es war einfacher, die SQL-Befehle in eine ArrayList zu schreiben. Obwohl ich Iteratoren verwendet habe, habe ich keine selbst geschrieben, also dachte ich nicht daran, es so zu schreiben. Jetzt, wo ich sie ein bisschen mehr benutzt habe, scheint es ein perfektes Szenario zu sein, um es zu benutzen. –