Taglib: problemas de rendimiento y bloqueos

Estoy usando la biblioteca taglib (1.7.2) en mi aplicación Qt para leer algunos metadatos de archivos mp3 de una carpeta de música. El problema es que lo encuentro muy lento.

Por ejemplo, este es el código:

QString path = "C:/Music/";
QDir d(path);
QStringList fileTypes;
fileTypes << "*.mp3" ;
d.setNameFilters(fileTypes);
QStringList pathList = d.entryList( QDir::NoDotAndDotDot | QDir::Files);

QTime t;
t.start();
foreach (QString fileName, pathList) {
    fileName = path + fileName;
    TagLib::FileRef *f = new TagLib::FileRef(fileName.toStdWString().c_str());
}
qDebug()<<t.elapsed();

Este código tarda unos 11 segundos en cargar una carpeta que contiene 400 canciones, es decir, unos 28 ms por cada archivo. Esta es la linea muy lenta:

TagLib::FileRef *f = new TagLib::FileRef(pathFile.toStdWString().c_str());

¿Es normal que sea tan largo? Intenté usar subprocesos múltiples, pero no cambia nada y no proviene de mi PC, ya que es lo suficientemente potente. Lo extraño es que una vez que se han cargado todos los archivos, la próxima vez que carga la carpeta nuevamente, se hace instantáneamente (hasta que reinicio el sistema operativo).


También tengo otro problema.

A veces, cuando no se establece una etiqueta, la aplicación falla y muestra:

HEAP[myapp.exe]: 
Invalid address specified to RtlFreeHeap( 0ED90000, 0ED92CC0 )

En la siguiente línea por ejemplo:

if (!f->tag()->genre().isNull())

Estoy usando Windows 7.

Gracias.

preguntado el 01 de julio de 12 a las 18:07

1 Respuestas

A veces, cuando no se establece una etiqueta, la aplicación falla y genera...

Es una de las muchas decisiones de diseño extrañas en TagLib. El objeto AudioProperties es NULL cuando no hay etiquetas. Tienes que vivir con eso y agregar un código adicional para verificar si hay NULL.

Lo extraño es que una vez que se han cargado todos los archivos, la próxima vez que carga la carpeta nuevamente, se hace instantáneamente (hasta que reinicio el sistema operativo)

No es extraño, ya que Windows 7 tiene un mecanismo de almacenamiento en caché de E/S de disco muy avanzado y agresivo. Una vez que "tocas" el archivo, llega a la RAM y la próxima vez que accedes a él, es casi instantáneo. 400 archivos mp3 no es mucho y todo cabe en la memoria RAM.

11s para cargar una carpeta que contiene 400 canciones

400 veces tiene que realizar una búsqueda de disco, lo que generalmente toma de 9 a 11 ms en una unidad de disco duro típica (sí, es solo 0.1 ms para el SSD). Entonces, tiene al menos 10 * 400 = 4 segundos solo para "rebobinar" la cabeza de la unidad, si la carpeta está fragmentada. Dado que las etiquetas id3 pueden aparecer al principio y al final del archivo, esto prácticamente aumenta el número de lecturas dos veces (tiene que rebobinar hasta el final del archivo), dando así el tiempo 2x (alrededor de 8 segundos).

Currículum: El tiempo para leer la carpeta se acerca a algo realista. Hay una serie de peculiaridades en TagLib (como NULL o la incapacidad de sobrecargar las operaciones de archivos para permitir, por ejemplo, leer desde archivos), pero son evitables. La funcionalidad de TagLib es realmente buena y en muchos aspectos es única (soporte de formato amplio).

Respondido 01 Jul 12, 20:07

Muchas gracias por tu explicación. - Christophe

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.