Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Database Reference.listen() is very slow for large responses

Abierto
#599 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
python
Área
database

Línea de trabajo

Comienza con la implementación de sseclient del Firebase Admin SDK utilizada por Reference.listen() y, después, compara su comportamiento al leer respuestas con el de btubbs/sseclient.py, enlazado. Reproduce el problema usando la prueba proporcionada para Raspberry Pi y confirma que las respuestas grandes de listen() ya no tardan unos 10 segundos ni utilizan casi el 100 % de la CPU, mientras que el callback sigue recibiendo el evento completo.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

api: database
Describe your environment
  • Operating System version: Linux raspberrypi 4.19.97+ (On a Raspberry Pi Zero W)
  • Firebase SDK version: 5.2.0
  • Firebase Product: database
  • Python version: 3.7.3
  • Pip version: 18.1
Describe the problem

Reading a large event in response to calling Reference.listen() is extremely slow on a Raspberry Pi Zero. This looks very similar to https://github.com/nhorvath/Pyrebase4/issues/45 and I noticed that the sseclient here is based on that from Pyrebase.

From reading the sseclient code, the Firebase Admin SDK seems to have solved the quadratic regex scanning issue that the sseclient in Pyrebase4 has, but it still reads the response one character at a time, which I suspect is the root issue. It looks like this is solved in https://github.com/btubbs/sseclient/blob/master/sseclient.py by reading in chunks when short reads are supported.

Steps to reproduce:

Modify the test code below to add a working databaseURL and run it. On my Raspberry Pi Zero W, it outputs:

0 ms: Initializing app...
1 ms: Getting DB reference...
17 ms: Putting 20000 bytes...
1122 ms: Getting data...
1347 ms: Got 20000 bytes with get().
1349 ms: Listening for data...
11686 ms: Got 20000 bytes with listen().

That is, listen() takes about 10 000 ms (with close to 100% CPU usage) to get and read the response, while get() takes 200 ms.

Relevant Code:
import firebase_admin
import firebase_admin.db
import sys
import time

count = 2000
nonsense = "abcedefghi"
start_time = time.time()

def log(msg):
  t = int(1000 * (time.time() - start_time))
  print(str(t) + " ms: " + msg)

log("Initializing app...")
firebase_admin.initialize_app(options={'databaseURL': 'https://XXXXXXXXXX.firebaseio.com/'})

log("Getting DB reference...")
ref = firebase_admin.db.reference("bringert_test_streaming_speed")

data = nonsense * count

log("Putting " + str(len(data)) + " bytes...")
new_data=ref.push(data)

log("Getting data...")
log("Got " + str(len(new_data.get())) + " bytes with get().")

def callback(event):
  if event.event_type == "put":
    log("Got " + str(len(event.data)) + " bytes with listen().")
    sys.exit(0)

log("Listening for data...")
new_data.listen(callback)
Lenguaje dominante
Python
Estrellas
1.2k
Forks
359
Merge medio
3 d 9 h
PR fusionados (30 d)
3

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de firebase/firebase-admin-python

Todos los issues de firebase/firebase-admin-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.