2009-04-20 12 views
7

Necesito crear archivos ZIP a pedido, utilizando el módulo de archivo zip de Python o las utilidades de línea de comandos de Unix.Estimación del tamaño de archivo zip/tiempo de creación

Los recursos que se deben comprimir suelen ser> 1 GB y no necesariamente compatibles con la compresión.

¿Cómo puedo estimar eficientemente el tiempo/tamaño de creación?

+0

Solo para aclarar, ¿quisiste estimar el tiempo y el tamaño de creación antes de crear el archivo o sobre la marcha? –

+0

de antemano. Las solicitudes ZIP están en cola. – ohnoes

+0

En cuyo caso, ignore mi respuesta y acepte Nils ':-) –

Respuesta

15

Extraiga un montón de piezas pequeñas del archivo grande. Tal vez 64 pedazos de 64k cada uno. Seleccionado aleatoriamente.

Concatenar los datos, comprimirlos, medir el tiempo y la relación de compresión. Como ha seleccionado al azar partes del archivo, es probable que haya comprimido un subconjunto representativo de los datos.

Ahora todo lo que tiene que hacer es estimar el tiempo para todo el archivo en función del tiempo de sus datos de prueba.

+0

Esta es una idea mejor que la mía. +1. – Skurmedel

3

Le sugiero que mida el tiempo promedio que lleva producir un archivo zip de un cierto tamaño. Luego, calcula la estimación a partir de esa medida. Sin embargo, creo que la estimación será muy difícil en cualquier caso si no sabes qué tan bien se comprime la información. Si los datos que desea comprimir tenían un "perfil" muy similar cada vez, probablemente podría hacer mejores predicciones.

0

Si está utilizando el método ZipFile.write() para escribir sus archivos en el archivo, se puede hacer lo siguiente:

  1. obtener una lista de los archivos que desea comprimir y sus tamaños relativos
  2. escritura un archivo en el archivo y el tiempo en el que se tomó
  3. Calcule el ETA en función del número de archivos escritos, su tamaño y cuánto queda.

Esto no funcionará si solo está comprimiendo un archivo realmente grande. Nunca he usado el módulo zip, así que no estoy seguro si funcionaría, pero para pequeños números de archivos grandes, tal vez podrías usar la función ZipFile.writestr() y leer/comprimir tus archivos en trozos. ?

1

Si es posible obtener devoluciones de llamada de progreso desde el módulo python, le sugiero que averigüe cuántos bytes se procesan por segundo (simplemente guardando en qué parte del archivo estaba al inicio del segundo y dónde se encuentra al final) Cuando tenga los datos de la velocidad de la computadora, puede guardarlos y usarlos como base para su próximo archivo comprimido. (Normalmente recopilo unas 5 muestras antes de mostrar un pronóstico de tiempo)

El uso de este método puede proporcionarle Microsoft minutes para obtener más muestras, necesitará promediarlo. Esto sería especialmente el caso si haces un archivo zip que contiene muchos archivos, ya que el ZIP tiende a desacelerarse al comprimir muchos archivos pequeños en comparación con 1 archivo grande.

Cuestiones relacionadas