es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Detener el recolector de basura de Node.js / cierre automático de los descriptores de archivos.

Considera un motor de base de datos, que opera en un archivo abierto externamente, parecido a SQLite, excepto que el identificador del archivo se pasa a su constructor. Estoy usando una configuración como esta para mi aplicación, pero no puedo entender por qué NodeJS insiste en cerrar el descriptor del archivo después de 2 segundos de operación. ¡Necesito que ese objeto se mantenga abierto!

const db = await DB.open(await fs.promises.open('/ruta/al/archivo/db', 'r+'));
...
(node:100840) Advertencia: Cerrando el descriptor del archivo 19 durante la recolección de basura
(Usa `node --trace-warnings ...` para mostrar dónde se creó la advertencia)
(node:100840) [DEP0137] Advertencia de degradación: Cerrar un objeto FileHandle durante la recolección de basura está en desuso. Por favor, cierra los objetos FileHandle explícitamente usando FileHandle.prototype.close(). En el futuro, se lanzará un error si se cierra un descriptor de archivo durante la recolección de basura.

La clase DB utiliza los descriptores de archivo proporcionados extensivamente, durante un período de tiempo prolongado, por lo que es bastante molesto que se cierre. En esa clase, estoy utilizando métodos como readFile, createReadStream() y el módulo readline para recorrer las líneas del archivo. Estoy pasando { autoClose: false, emitClose: false } a cualquier flujo de lectura/escritura que esté utilizando, pero sin éxito.

  1. ¿Por qué está sucediendo esto?
  2. ¿Cómo puedo detenerlo?

Gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    1. El mensaje de advertencia sugiere que el descriptor de archivo se está cerrando durante la recolección de basura. Esto significa que el descriptor de archivo no se está cerrando explícitamente en tu código o en alguna biblioteca que estés utilizando, sino que se está cerrando automáticamente por Node.js cuando detecta que el objeto ya no se está utilizando ni se está haciendo referencia a él en ninguna parte del programa. Este comportamiento es resultado del mecanismo de recolección de basura de Node.js, que libera automáticamente la memoria utilizada por objetos que ya no son necesarios en el programa.
    2. Para evitar que Node.js cierre el descriptor de archivo, puedes mantener explícitamente una referencia al objeto de la base de datos (DB) en tu código, en lugar de depender de la recolección de basura para mantenerlo en memoria. Esto evitará que Node.js detecte que el objeto ya no es necesario y cierre el descriptor de archivo como resultado. También puedes cerrar explícitamente el handle del archivo cuando hayas terminado con él, utilizando el método .close() en el objeto del handle del archivo.

    Ejemplo:

    const dbHandle = await fs.promises.open('/ruta/al/archivo/db', 'r+');
    const db = await DB.open(dbHandle);
    
    // Usa el objeto DB según sea necesario
    // ...
    
    // Cierra explícitamente el handle del archivo cuando hayas terminado
    dbHandle.close();
    

    Al mantener explícitamente una referencia al handle del archivo y cerrarlo cuando hayas terminado, puedes asegurarte de que el descriptor de archivo permanezca abierto durante toda la duración de la ejecución de tu programa, en lugar de que Node.js lo cierre durante la recolección de basura.

Comments are closed.