¿Abrir archivo desde una posición particular?

¿Abrir archivo desde una posición particular?

Me preguntaba, si tuviera un archivo particularmente grande, digamos 64 MB, ¿es posible determinar la ubicación física del archivo en el disco duro y luego leer bytes de un desplazamiento particular en el archivo?

Digamos que estoy interesado en 100 bytes con un desplazamiento de 60 MB desde el inicio del archivo. No quiero las ineficiencias de los cientos de búsquedas en disco que se necesitarían para llegar desde el inicio del archivo hasta el final si usara alguna función de búsqueda () a nivel de aplicación.

¿Hay alguna solución?

¡Muchas gracias!

Respuesta1

Parece que tienes una idea errónea sobre cómo seek()se comporta. Localiza el lugar donde se almacenan los datos en este desplazamiento de la manera más eficiente posible, sin leer los bytes intermedios. Habrá algunas búsquedas (probablemente no cientos) para recorrer el índice del bloque.

Lo que no puede hacer es guardar el recorrido del índice del bloque desde un momento en que se abre el archivo hasta el siguiente. El sistema operativo tendría que recordar que el archivo no ha sido modificado ni reubicado desde la última vez que se abrió, lo que requeriría memorizar una gran cantidad de datos para obtener una ganancia potencial muy pequeña.

Tenga en cuenta que, en general, el contenido de un archivo no se encuentra en posiciones consecutivas del disco. Los archivos tienden a estar fragmentados. Los sistemas de archivos normalmente intentan reducir la fragmentación, pero esto no se puede garantizar en general.

Respuesta2

Releyendo, parece que tal vez no respondí la pregunta subyacente:

El uso de "búsqueda" en el nivel de la aplicación (en realidad, del kernel) no necesariamente cuesta ninguna "búsqueda" en el disco; todo lo que hace es actualizar el número de desplazamiento asociado con el identificador del archivo.

Una vez que le pida al kernel que lea o escriba, traducirá ese desplazamiento en un desplazamiento de disco, lo que puede implicar la lectura de bloques para descubrirlo, pero en el mejor de los casos tiene un costo de una búsqueda, tal como lo haría su acceso directo.

Es absolutamente posible hacer eso: después de todo, eso es exactamente lo que hace el controlador del sistema de archivos, por lo que debe ser posible para otra persona. Todo lo que necesitas es acceso al disco sin formato.

Allá son de ejemplosde personas que hacen eso para formatos de sistemas de archivos existentes. También puedes hacerlo a mano si quieres.

Si el sistema de archivos está en uso activo, tiene algunos desafíos técnicos que lo hacen más difícil de hacer, porque el contenido en el disco cambia de una manera que no se puede ver, pero aún es posible.

También puedes preguntarle al kernel directamente; elxfs_bmapLa herramienta hace eso, y al menos algunos sistemas de archivos implementan la misma interfaz para que puedas preguntar directamente.

Sin embargo, calcular la ubicación requerirá la misma cantidad de búsquedas que realizaría el kernel, por lo que es poco probable que realmente guardecualquier cosahaciendo esto.

Respuesta3

No me parece.

Si abre el archivo, estará al principio (para lectura/escritura) o al final (para agregar). Incluso en el "modo de actualización", no llegará simplemente a una ubicación específica en el medio del archivo.

Creo que lo mejor que puedes hacer es lo que ya eludiste: si puedes calcular el desplazamiento desde el principio, puedes buscar esa ubicación directamente y leer los datos. No creo que esto implique operaciones de lectura excesivas en el medio. La próxima lectura después de abrir el archivo debe tener el desplazamiento calculado.

información relacionada