2010-04-01 15 views
8

Estoy tratando de comprender mejor cuándo debo y no debo usar iteradores. Para mí, cada vez que tengo una gran cantidad de datos para repetir, escribo un iterador para ello. Si también se presta a la interfaz Iterator, parece una victoria.Java: ¿cuándo usar Iterators?

Estaba leyendo un poco que hay una gran sobrecarga con el uso de un iterador.

Un buen ejemplo de donde utilicé un iterador fue iterar a través de un conjunto de scripts SQL para ejecutar una consulta a la vez, leerla y luego ejecutarla.

¿Hay alguna otra compensación de rendimiento que deba tener en cuenta? Antes de usar iteradores, leía todos los comandos de la Cadena de SQL para ejecutarlos en una ArrayList, y los iteraba. Si la importación es bastante grande (como para los datos de geolocalización, entonces el servidor tiende a atascarse).

Walter

+0

Bastante bien la respuesta ya está aquí: http://stackoverflow.com/questions/1879255/traditional-for-loop-vs-iterator-in-java – Zak

Respuesta

9

Creo que su pregunta es cuándo debe 'transmitir' la entrada en lugar de cargar todo en la memoria y procesarla. No es realmente una cuestión de usar Iterator o no, creo.

"Depende", por supuesto, aunque en su ejemplo dado suena como la transmisión de la entrada en lugar de cargarlo todo en la memoria es una clara victoria, así que repita de hecho.

La ventaja de cargar en la memoria suele ser que el código es más simple, y tal vez obtenga algún beneficio de cargar grandes fragmentos en la memoria a la vez en lugar de leer bits a la vez. El beneficio de la "transmisión" es que limita los requisitos de memoria y obtiene un rendimiento asociado a eso.

Como regla muy cruda, no cargaría nada como esto en la memoria a menos que estuviera seguro de que estaba por debajo de 100K o menos.

+0

Gracias por su contribución - Sí, eso es a lo que estaba llegando, así como la validez del iterador.Me gusta estar expuesto a diferentes enfoques para resolver el mismo problema. Ambos funcionarán, a medida que los archivos se vuelvan más y más grandes, eventualmente el iterador será más eficiente y no consumirá toda la memoria en el servidor. –

1

Un buen ejemplo de donde yo era un iterador para recorrer un montón de secuencias de comandos SQL para ejecutar una consulta a la vez, leerlo, luego ejecutarlo.

En este escenario, la sobrecarga de un iterador es probablemente menor que el tiempo necesario para ejecutar las consultas.

Antes de utilizar los iteradores, leía los comandos completos de la Cadena de SQL para ejecutarlos en una ArrayList, y los iteraba a través de eso. Si la importación es bastante grande (como para los datos de geolocalización, entonces el servidor tiende a atascarse).

¿Alguna razón en particular necesita reunirlos en una ArrayList? Podrías ejecutarlos uno por uno mientras lees las declaraciones.

Los iteradores son especialmente adecuados para la transmisión de casos en los que los datos se cargan/crean sobre la marcha o de forma lenta. No requieren que los datos estén completamente en la memoria por adelantado.

+0

Usé una ArrayList en ese momento porque necesitaba mantener el orden y era más fácil poner los comandos SQL en una ArrayList. Aunque he usado iteradores, no he escrito ninguno antes, así que no pensé en escribirlo de esa manera. Ahora que los he usado un poco más, parece un escenario perfecto para usarlo. –

Cuestiones relacionadas