Almacene cientos de versiones en un server: ¿qué compression usar?

Para un proyecto de editor de text en línea que estoy construyendo, el ahorro de proyectos es similar a lo que hace http://jsfiddle.net :

  • la primera versión es sdf23f ,
  • el segundo Save lleva a sdf23f/1 , el tercer Save conduce a sdf23f/2 , etc.

Cuando alguien pulsa Save , se llama un file PHP que guarda los datos en el server:

 <?php if(!empty($_POST['data'])){ $data = $_POST['data']; $fname = $_POST['id']; $file = fopen("data/" . $fname, 'w'); fwrite($file, $data); fclose($file); } ?> 

Luego habrá cientos de versiones (es decir, cientos de files similares) en la misma carpeta.

¿En qué etapa se debe realizar la compression para poder save el almacenamiento del server? ¿Qué tipo de compression? ¿Dentro de PHP, o debería la compression ser almacenada por algo más?

¿En qué etapa se debe realizar la compression para poder save el almacenamiento del server?

Erm … antes de save los files.

¿Dentro de PHP, o debería la compression ser almacenada por algo más?

Estoy seguro de que podría implementar una "compression" adecuada dentro de PHP … si supiera lo que está haciendo. Pero también existen utilidades para hacer este tipo de cosas (ciertamente en Linux / Unix …)

Pero creo que lo que realmente necesitas saber es qué tipo de técnica de "compression" usar. Y la respuesta es que la forma de ahorrar espacio cuando se almacenan varias versiones de un file de text es (típicamente) para almacenar las diferencias entre las versiones sucesivas, en lugar de las versiones completas. Entonces puedes almacenar:

  • La última versión completa (decir la versión N).
  • Diferencias de la versión N a la versión N – 1
  • Diferencias de la versión N -1 a la versión N – 2.
  • y así.

Entonces es posible comprimir (en el sentido convencional) el file base y las diferencias, aunque si los files de diferencia son pequeños, no serán muy compresibles.

La otra cosa que necesita hacer al espacio (en un sistema de files típico) es no almacenar muchos files pequeños individuales. Un sistema de files típico asigna espacio en disco en bloques de algunos kilobytes. Si sus files son pequeños, termina desperdiciando una proporción significativa del último bloque de disco en cada file. Eso puede ser significativo.

La forma estándar de tratar eso es usar un formatting de "file" (como tar o zip) que pueda contener múltiples "files" en un solo file. Luego puede comprimir el file para ahorrar espacio adicional. (Aunque comprimir files que ya están comprimidos no ayudará …)


@Rasclatt comentó:

¿Por qué no guardas en una database?

Bien:

  • El uso de una database no aborda directamente el problema del uso del espacio per se . (A less que la database tenga soporte de compression)

  • Luego debe acceder a los files a través de la database … que generalmente es más lenta que si los lee directamente desde el sistema de files.