Estimación del tamaño del zip / tiempo de creación

Necesito crear archivos ZIP a pedido, utilizando el módulo zipfile de Python o las utilidades de línea de comandos de Unix.

Los recursos para comprimir son a menudo> 1 GB y no necesariamente compatibles con la compresión.

¿Cómo estimo eficientemente su tiempo / tamaño de creación?

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

Concatene los datos, comprímalos, mida el tiempo y la relación de compresión. Dado que 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.

Le sugiero que mida el tiempo promedio que toma producir un zip de un tamaño determinado. Luego calculas la estimación a partir de esa medida. Sin embargo, creo que la estimación será muy aproximada en cualquier caso si no sabes qué tan bien se comprimen los datos. Si los datos que desea comprimir tuvieran un “perfil” muy similar cada vez, probablemente podría hacer mejores predicciones.

Si es posible obtener devoluciones de llamadas de progreso del módulo de Python, sugeriría averiguar cuántos bytes se procesan por segundo (simplemente almacenando dónde se encuentra en el archivo donde estaba al comienzo del segundo y dónde está al final). Cuando tenga los datos sobre la rapidez con la que puede estar la computadora, puede guardarla y utilizarla como base para su próximo archivo zip. (Normalmente recojo alrededor de 5 muestras antes de mostrar los pronósticos de tiempo)

El uso de este método le puede dar minutos de Microsoft, por lo que a medida que obtenga más muestras, tendrá que promediarlas. Este sería especialmente el caso si crea un archivo zip que contenga muchos archivos, ya que el ZIP tiende a disminuir cuando se comprimen muchos archivos pequeños en comparación con 1 archivo grande.

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

  1. Obtenga una lista de los archivos que desea comprimir y sus tamaños relativos
  2. Escriba un archivo en el archivo y mida cuánto tiempo tomó
  3. Calcule ETA basándose en la cantidad de archivos escritos, su tamaño y cuánto queda.

Sin embargo, esto no funcionará si solo estás comprimiendo un archivo realmente grande. Nunca he usado el módulo zip, por lo que no estoy seguro de si funcionaría, pero para una pequeña cantidad de archivos grandes, tal vez podría usar la función ZipFile.writestr () y leer / comprimir sus archivos en trozos. ?