La aplicación My React Native carga algunos documentos de Firestore y los almacena localmente en AsyncStorage. Dependiendo del uso de la aplicación por parte del usuario, esta colección de documentos puede llegar a ser bastante grande. Puede suceder que los documentos de un usuario específico crezcan a decenas de megabytes, juntos (por ejemplo, 500 documentos de aproximadamente 100kB cada uno).
(Puede ser un antipatrón usar Firestore para documentos que son tan grandes. Sin embargo, la mayoría de los casos de uso se ocupan de una pequeña cantidad de documentos pequeños. Aún así, debemos preparar la aplicación para usuarios avanzados)
La aplicación utiliza AsyncStorage como caché local de los datos de los documentos. Si los datos ya están allí, no se carga nada desde Firestore (al menos inicialmente). De lo contrario, los datos se cargan desde Firestore y se almacenan en AsyncStorage (no podemos usar el caché de Firestore porque transformamos los datos al cargarlos y necesitamos un caché determinista).
Lo que notamos es que, al cargar los datos de Firestore, terminamos con un gran consumo de memoria, incluso después de que hubo suficiente tiempo para que Garbage Collection recopilara todo. Al cargar los datos desde AsyncStorage, el consumo de memoria es mucho menor, aunque tengamos los mismos datos en memoria.
Para asegurarme de que esta memoria aún se conserve (es decir, que mi observación no dependa del tiempo de recolección de basura), cargué alrededor de un Gigabyte de datos de Firestore en un dispositivo. Hubo varias advertencias de memoria y, a juzgar por el consumo de memoria observado, GC estaba trabajando arduamente para recopilar la mayor cantidad posible, pero el consumo de memoria seguía siendo varios Gigabytes más alto que cuando los datos se cargaron desde AsyncStorage.
Parece que el cliente de Firestore tiene
¿He pasado algo por alto? ¿Hay algún caché en memoria habilitado de forma predeterminada? ¿Firestore guarda una copia de los datos en la memoria para detectar cambios en los documentos?