¿Cuál es la mejor manera de ordenar una colección al actualizar una barra de progreso? Actualmente tengo un código como éste:Ordenar una gran colección mientras se muestra el progreso
for (int i = 0; i < items.size(); i++)
{
progressBar.setValue(i);
// Uses Collections.binarySearch:
CollectionUtils.insertInOrder(sortedItems, item.get(i));
}
Esta muestra progreso, pero la barra de progreso se ralentiza a medida que el número de artículos en sortedItems
se hace más grande. ¿Alguien tiene un mejor enfoque? Idealmente, me gustaría utilizar una interfaz similar a Collections.sort()
para que pruebe diferentes algoritmos de clasificación.
Cualquier ayuda sería grande!
como un poco de fondo, este código está tirando hacia atrás un montón de documentos (1-10 millones) de Lucene y la ejecución de un comparador de encargo sobre ellos. Ordenarlos escribiendo datos en el disco será demasiado lento para ser práctico. La mayor parte del costo es leer el artículo en el disco y luego ejecutar el comparador sobre los artículos. Mi PC tiene mucha memoria, así que no hay problemas relacionados con el intercambio en disco, etc.
Al final fui con la solución de Stephen porque era muy limpia y me permitió agregar fácilmente un algoritmo de clasificación de subprocesos múltiples.
¿Su barra de progreso tiene algún valor máximo definible? Porque el 30% de una matriz de 9000 longitudes es muy diferente al 30% de una matriz de 90 longitudes. – nearlymonolith
@Anthony el valor máximo para la barra de progreso es 'items.size()'. Normalmente estoy clasificando millones o decenas de millones. –
No elegiría ordenar decenas de millones de elementos en la memoria. Es más probable que los escriba en un archivo de disco y llame a un sistema operativo de ordenación. –