Pregunta

En mi programa, tengo dos archivos abiertos para la escritura, un archivo de contenido, que contiene fragmentos de datos, y un archivo de índice, que contiene un mapa sobre el que fragmentos de datos se ha escrito hasta ahora.

Me gustaría eliminar a los dos en un disco, como performant como sea posible, con la única restricción de que los bloques en el archivo de datos deben ser escritos antes de que los bloques correspondientes en el mapa-archivo (naturalmente).

El problema es que me gustaría evitar el bloqueo POR EJEMPLO haciendo un fsync, tanto para la latencia y el rendimiento-razones.

¿Alguna idea?

¿Fue útil?

Solución

No creo que usted puede hacer esto fácilmente en una sola ruta de ejecución. Usted necesita tener fsync la escritura en el disco garantizado - y esto va a tener que esperar a la escritura.

sospecho que es posible (pero no es fácil) para hacer esto, delegando la tarea de escritura a un proceso o subproceso separado. Generar los datos en su programa existente y 'escribir' a la segunda rosca / proceso de cualquier forma que se ve sensato. Esto puede ser no bloqueante. El segundo hilo sería luego escribir los nuevos datos a los datos a su contenido en archivos, a continuación, fsync, a continuación, escribir el índice de archivo, a continuación, comprobar si hay nuevos datos de nuevo. las decisiones de diseño clave refieren a cómo se separan las dos rutas de ejecución, la forma de comunicarse entre ellos, y si necesita reportar la parte posterior de escritura en el programa principal. Esto todavía podría tener problemas de latencia y el rendimiento, pero eso es parte del costo de la elección de tener el índice de archivo y el contenido en archivos sincronizados. Al menos habría una posibilidad de realizar el trabajo mientras espera en el disco.

Podría ser digno de mirar para ver si esto está bien encapsulada para que sea útil en la fuente de cualquiera de las bases de datos transaccionales. También podría investigar la opción de sincronización cuando se monta el sistema de archivos para el contenido del archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top