manejo - leer archivo txt c++ linea por linea
Eliminar el principio del archivo sin volver a escribir todo el archivo. (3)
¿Qué pasa con la configuración de un proceso separado que cambia el nombre del archivo de salida cuando alcanza un tamaño predefinido (por ejemplo, agregando el tiempo de linux al final del nombre del archivo)?
Esto le permitiría mantener los datos antiguos y el proceso principal volverá a crear el archivo de salida la próxima vez que lo escriba.
Otro trabajo cron puede eliminar el archivo antiguo de vez en cuando.
Tengo un sistema Linux incorporado, que almacena datos en un archivo muy grande, agregando datos nuevos al final. A medida que el tamaño del archivo crece cerca del espacio de almacenamiento disponible, debo eliminar los datos más antiguos.
El problema es que realmente no puedo aceptar la interrupción que se necesitaría para mover el volumen masivo de datos "arriba" del archivo, como lo hace normalmente, bloquear el archivo durante un período prolongado de tiempo para volver a escribirlo (además, este es un medio flash) , causaría desgaste innecesario al flash).
Probablemente, la forma más fácil sería dividir el archivo en varios más pequeños, pero esto tiene varias desventajas relacionadas con la forma en que se manejan y procesan los datos: todo el software del "cliente final" espera un solo archivo. OTOH puede manejar la "corrupción" de tener el primer registro cortado a la mitad, por lo que el archivo no necesita ser recortado en las compensaciones de registro, solo "en algún lugar", por ejemplo, los primeros iNodes liberados. Los datos más antiguos están obsoletos de todos modos, por lo que es aún más aceptable la corrupción más grave del principio del archivo, siempre que la "cola" permanezca limpia y se puedan tomar libertades con la cantidad exacta que se elimina, "aproximadamente varios primeros megabytes" está bien , no es necesaria la precisión de ''primer 4096KB exactamente''.
¿Hay algún método, API, truco, truco para truncar el inicio del archivo de esa manera?
La solución más fácil para sus aplicaciones antiguas sería un sistema de archivos FUSE que les dé acceso al archivo subyacente, pero con el desplazamiento desplazado cíclicamente. Esto le permitiría implementar un ringbuffer en el nivel físico. La capa FUSE sería bastante trivial ya que solo necesita ajustar todas las posiciones de archivo por un tamaño de archivo de módulo constante.
Puede alcanzar el objetivo con el kernel de Linux v3.15 anterior para el sistema de archivos ext4 / xfs.
int ret = fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, 0, 4096);
Vea aquí Truncando los primeros 100MB de un archivo en linux