Estoy archivando datos en DVD, y quiero empacar los DVD por completo. Sé los nombres y tamaños de todos los archivos que quiero en el DVD, pero no sé cuánto espacio ocupan los metadatos. Quiero obtener tantos archivos como sea posible en cada DVD, así que estoy usando una heurística Bubblesearch con codicioso bin-packing. Intento 10,000 alternativas y obtengo la mejor. Actualmente conozco el tamaño de todos los archivos y, como no sé cómo se almacenan los archivos en un sistema de archivos ISO 9660, agrego mucha pendiente para los metadatos. Me gustaría reducir la basura.¿Cómo puedo predecir el tamaño de un sistema de archivos ISO 9660?
Podría usar genisoimage -print-size
excepto que es demasiado lento --- dado 40,000 archivos que ocupan 500MB, toma alrededor de 3 segundos. Tomar 8 horas por DVD no está en las tarjetas. Modifiqué la fuente genisoimage
antes y no estoy realmente dispuesto a intentar exprimir el algoritmo del código fuente; Espero que alguien sepa una mejor manera de obtener un presupuesto o me pueda indicar una especificación útil.
Aclarar el problema y la pregunta:
necesito para quemar archivos que se dividen en varios DVDs, típicamente alrededor de cinco a la vez. El problema que trato de resolver es decidir qué archivos colocar en cada DVD, para que cada DVD (excepto el último) esté lo más lleno posible. Este problema es NP-difícil.
Estoy usando el algoritmo estándar de empaquetado codicioso donde coloca primero el archivo más grande y lo coloca en el primer DVD que tiene espacio suficiente. Así que j_random_hacker, definitivamente soy no comenzando de forma aleatoria. Empiezo por ordenado y uso Bubblesearch para perturbar el orden en que se empaquetan los archivos. Este procedimiento mejora mi empaque desde aproximadamente el 80% de la capacidad estimada a más del 99.5% de la capacidad estimada. Esta pregunta se trata de haciendo un mejor trabajo al estimar la capacidad; actualmente mi capacidad estimada es menor que la capacidad real.
He escrito un programa que intenta 10.000 perturbaciones, cada uno de los cuales implica dos pasos:
- elegir un conjunto de archivos
- Estimar la cantidad de espacio dichos archivos tendrán en DVD
El paso 2 es el paso que trato de mejorar. En este momento, estoy "equivocando por el lado de la precaución", como sugiere Tyler D. Pero me gustaría hacerlo mejor. No puedo permitirme usar
genisomage -print-size
porque es demasiado lento. Del mismo modo, no puedo atacar los archivos en el disco, porque solo es demasiado lento, pero un archivo tar no tiene el mismo tamaño que una imagen ISO 9660. Es el tamaño de la imagen ISO 9660 que necesito para predecir. En principio, esto podría hacerse con total precisión, pero no sé cómo hacerlo. Esa es la pregunta.
Nota: estos archivos se encuentran en una máquina con 3 TB de almacenamiento en disco duro. En todos los casos, el tamaño promedio de los archivos es de al menos 10 MB; a veces es significativamente más grande. Entonces, es posible que genisomage
sea lo suficientemente rápido después de todo, pero lo dudo --- parece funcionar escribiendo la imagen ISO en/dev/null, y no me puedo imaginar que será lo suficientemente rápido cuando el tamaño de la imagen se acerca a 4.7GB. No tengo acceso a esa máquina en este momento o cuando publiqué la pregunta original. Cuando tenga acceso en la tarde, trataré de obtener mejores números para la pregunta.Pero no creo que genisomage
vaya a ser una buena solución --- aunque podría ser una buena forma de aprender un modelo del sistema de archivos que me dice cómo funciona. Saber que el tamaño del bloque es 2KB ya es útil.
También puede ser útil saber que los archivos en el mismo directorio se graban en el DVD de samae, lo que simplifica la búsqueda. Deseo acceder directamente a los archivos, lo que descarta tar-before-burning. (La mayoría de los archivos son de audio o video, lo que significa que no tiene sentido tratar de golpearlos con gzip
.)
@jrh: mi algoritmo es similar pero no idéntico.Si desea publicar una pregunta 'al grabar archivos en varios DVD, ¿cómo puedo embalar cada DVD lo más completo posible', intentaré dar una respuesta detallada . (Mejor enviarme un correo electrónico con la URL de la pregunta.) –