¿Formato contenedor sin compresión y acceso aleatorio?

Estoy con unos experimentos en PHP y como ya puse en otro hilo, me gustaría tener las imágenes contenidas en un fichero. No quiero compresión primero por velocidad y segundo porque sería tontería comprimir imágenes que ya de por sí van a ir en formatos ya comprimidos como jpg o png.

Así que en un principio opté por el contenedor tar, pero según se lee en todas partes la lectura en este tipo de archivos es secuencial, es decir, que para cargar el cuarto fichero tiene necesariamente que haber leído los tres anteriores, y esto con las pruebas que estoy haciendo ahora dará un poco igual, pero cuando crezca el número de imágenes imagino que el rendimiento caerá en picado.

Me gustaría oir recomendaciones de formatos de archivo para lo que busco, cuanto más libres e integrados en el propio ecosistema GNU/Linux mejor.

Ah, y que también se pueda acceder a un fichero en concreto contenido dentro, fácilmente en PHP.
No estoy muy puesto en formatos ya existentes, pero programarte tu mismo un contenedor no tiene que ser muy complicado tampoco; mantén una tabla al comienzo del contenedor con las posiciones de inicio de cada imagen y después de la tabla todas las imágenes una detrás de otra. Cuando quieras acceder a una imagen, miras la tabla, saltas a la posición indicada del contenedor y comienzas a leer la imagen hasta que empiece la siguiente imagen.
rar tiene opcion de crear ficheros sin compresion, creo que zip tambien. http://php.net/manual/en/book.zip.php
Tienes dictzip el cual tiene un diccionario y permite una búsqueda aleatoria mas o menos eficiente.

Una pregunta, tienes acceso completo a ese servidor? ya que podrías poner todas tus imágenes en un squashfs y luego subirlo y montarlo. Esto lo he usado yo para subir contenedores de imágenes geoespaciales (tiling de imágenes de satélite para mapas) de muchos gigas (y millones de imágenes en cientos de directorios) sin morir en el intento.

En lo personal me parece que estar subiendo y actualizando contenedores cada vez que necesites subir una nueva imagen es una perdida de tiempo. Si lo que vas a hacer es almacenar apuntes, artículos y demás, ¿por que no usas un CMS, lo configuras y vuelcas toda tu info alli? Asi te evitas reinventar la rueda con soluciones en PHP.
Puyover escribió:No estoy muy puesto en formatos ya existentes, pero programarte tu mismo un contenedor no tiene que ser muy complicado tampoco; mantén una tabla al comienzo del contenedor con las posiciones de inicio de cada imagen y después de la tabla todas las imágenes una detrás de otra. Cuando quieras acceder a una imagen, miras la tabla, saltas a la posición indicada del contenedor y comienzas a leer la imagen hasta que empiece la siguiente imagen.

No será muy difícil, no, pero tampoco tengo intención de reinventar la rueda. Si puedo aprovechar algún formato de fichero ya creado y que ya tenga una API para acceder a él desde PHP mejor que mejor.


Zokormazo escribió:rar tiene opcion de crear ficheros sin compresion, creo que zip tambien. http://php.net/manual/en/book.zip.php

Cierto, no lo recordaba. Lo importante es que tenga una tabla de contenidos al inicio del fichero y así facilite el acceso aleatorio.

Tengo que hacer unas pruebas de tiempos de ejecución tar vs zip sin compresión, con unas cuantas imágenes BMP de cerca de 4 MB, a ver si se nota la diferencia.


codestation escribió:Tienes dictzip el cual tiene un diccionario y permite una búsqueda aleatoria mas o menos eficiente.

Una pregunta, tienes acceso completo a ese servidor? ya que podrías poner todas tus imágenes en un squashfs y luego subirlo y montarlo. Esto lo he usado yo para subir contenedores de imágenes geoespaciales (tiling de imágenes de satélite para mapas) de muchos gigas (y millones de imágenes en cientos de directorios) sin morir en el intento.

En lo personal me parece que estar subiendo y actualizando contenedores cada vez que necesites subir una nueva imagen es una perdida de tiempo. Si lo que vas a hacer es almacenar apuntes, artículos y demás, ¿por que no usas un CMS, lo configuras y vuelcas toda tu info alli? Asi te evitas reinventar la rueda con soluciones en PHP.

Vamos por partes...

1. Dictzip no me sirve, es comprimido sí o sí (por lo que he podido leer), y no quiero compresión, sólo aglutinar imágenes dentro de un sólo fichero. Además tampoco hay ninguna implementación para leer este formato de fichero en PHP.

2. SquashFS es un buen invento, pero estamos en lo de antes, no quiero compresión (a no ser que el algoritmo de compresión usado ignore ciertos formatos de archivo como pueden ser png y jpg, creo que alguno había que hacía eso), y además no es algo tan portable como quisiera. Aparte de eso, no me valdría un hosting normal y necesitaría un VPS o un servidor dedicado.

3. Sí, lo que estoy haciendo es una especie de biblioteca para tener artículos y apuntes. En un principio estuve buscando información sobre wikis, pero ninguna me convencía, o tiraban mucho de javascript, o cada documento era un fichero... y soluciones como Wordpress se me hacen muy pesadas.
Quiero sobre todo algo muy ligero, con un tema muy simple con texto blanco sobre fondo negro y los documentos básicamente van a ser elementos html tales como párrafos, imágenes, listas, tablas, enlaces y poco más. Tampoco necesito blogs y wikis con sus cuarentamil opciones y funcionalidades.
Me gustaría también que aparte de poder colgarse en internet -por ejemplo en un VPS que pille para pruebas- lo pueda tener de forma local y pasarlo fácilmente a un pendrive, cosa que sería bastante rápida si fueran 4 o 5 ficheros php; una base de datos SQLite (en la cual ya tengo las tablas planeadas) para almacenar los artículos, categorías y demás información relativa a ellos; y un fichero pongamos por ejemplo zip sin compresión donde están todas las imágenes y quizás algún fichero adjunto que enlace en algún documento.

Lo bueno de usar formatos tan extendidos para guardar artículos e imágenes significa que por ejemplo podría hacerme también una app para el móvil para ver los contenidos de forma local (busqué info y en Android se puede embeber un navegador dentro de una app), o como si lo quiero hacer para esritorio en QT. No sé, son muchas posibilidades.



Gracias a todos por las sugerencias, siempre se aprenden cosas interesantes.
No acabo de entender muy bien por qué quieres hacer eso, pero tal vez te sirva usar sqlite y meter las imágenes como blobs.
MutantCamel escribió:No acabo de entender muy bien por qué quieres hacer eso, pero tal vez te sirva usar sqlite y meter las imágenes como blobs.

Esa opción ya la contemplé, pero prefiero tener el contenido (texto) separado de las imágenes.
Pues un sqlite para el texto y otro para las imágenes... quién dice que tienen que ir en el mismo fichero?
Pues sí, yo y mi mente cuadriculada.
8 respuestas