2011-05-13 29 views
8

Si tengo un archivo grande que contiene muchos ceros, ¿cómo puedo hacerlo eficientemente como un archivo disperso?¿Cómo hacer que el archivo sea escaso?

¿Es la única posibilidad de leer todo el archivo (incluidos todos los ceros, que patrialmente pueden almacenarse dispersos) y reescribirlo en un nuevo archivo utilizando buscar omitir las áreas cero?

¿O existe la posibilidad de hacer esto en un archivo existente (por ejemplo, File.setSparse (long start, long end))?

Estoy buscando una solución en Java o algunos comandos de Linux, Filesystem será ext3 o similar.

+3

La primera solución se implementa en 'cp ​​--sparse = always', pero no es eficiente y requiere copiar el archivo y moverlo después. – rurouni

+1

http://stackoverflow.com/questions/245251/create-file-with-given-size-in-java – joe776

+0

@joe: se trata de crear un archivo disperso desde cero, pero quiero ta hacer un archivo existente disperso. – rurouni

Respuesta

3

Algunos sistemas de archivos en Linux/UNIX tienen la capacidad de "abrir agujeros" en un archivo existente. Ver:

No es muy portátil y no se realiza de la misma manera en todos los ámbitos; a partir de ahora, creo que las bibliotecas IO de Java no proporcionan una interfaz para esto.

Si la perforación está disponible ya sea a través de fcntl(F_FREESP) o mediante cualquier otro mecanismo, debe ser significativamente más rápido que un ciclo de copia/búsqueda.

+0

¿sabes si hay una herramienta que aplica esto a un archivo ya que no soy un pirata informático experimentado? – rurouni

+0

respuesta de la mejor calidad. Gracias – sehe

0

De acuerdo con este article, parece que actualmente no existe una solución fácil, excepto para usar FIEMAP ioctl. Sin embargo, no sé cómo puedes hacer bloques cero "no dispersos" en bloques "dispersos".

2

Creo que sería mejor que preasigne el archivo completo y mantenga una tabla/BitSet de las páginas/secciones ocupadas.

Al hacer que un archivo sea escaso, estas secciones se fragmentarían si alguna vez se vuelven a utilizar. Tal vez ahorrar unos pocos TB de espacio en disco no valga la pena de rendimiento de un archivo altamente fragmentado.

0

Puede utilizar $ truncate -s filename filesize en teminal de Linux para crear el archivo dispersa que tiene

única metadatos.

NOTA --El tamaño de archivo está en bytes.

Cuestiones relacionadas