Repository navigation
La carga de GOA filtra la accesión antes de construir el record, sin mover una línea de página - #998
Conversation
…mover una línea de página Casi todas las líneas de una release de GOA son de proteínas de fuera del corpus: en la 167, 385,0 M de 392,8 M. El plugin de GOA construía un GoaAnnotationRecord validado para cada una, el bucle lo guardaba en el buffer y _store_buffer lo recorría otra vez solo para tirarlo. protea-sources 0.2.1 (ya en el lock, 946227ca) acepta un predicado `accept` sobre las columnas crudas y no construye record para una línea que rechaza. Ahora la carga se lo pasa, con la misma prueba de accesión que aplica _store_buffer, carácter a carácter. Lo único que cambia es la velocidad. Una línea rechazada antes de tiempo no lleva datos, así que se cuenta en vez de guardarse en el buffer, pero sigue ocupando su sitio en `lines`, en su página y en `not_in_universe`. Las páginas terminan en las mismas líneas. Una página entera de rechazos se vuelca, hace commit y emite su page_done como cualquier otra. source.goa.download_done se retiene hasta colocar los rechazos finales, porque antes llegaba después de su page_done. Medido en el nodo de cómputo (i5-12400F, Python 3.14), sobre las primeras 8 M líneas de la release 190, con page_size 200.000 y una sesión mock, así que es solo CPU, sin round trips a la base de datos: - sin filtro: 39,6 s de CPU, 202.224 líneas por segundo de CPU; - con filtro: 8,1 s de CPU, 992.555 líneas por segundo de CPU; - 4,9x, con los mismos totales en ambos: lines 7.999.992, inserted 14.834, not_in_universe 7.984.869 y 40 páginas. La cabeza del fichero acepta el 0,19% de las líneas, por debajo de la media de una release entera, así que en una release completa la ganancia será algo menor. El bucle de páginas sale a _goa_pages.py, como el informe salió a _goa_load_report.py, para que la operación no pase de los topes de tamaño. _flush_page y _store_buffer no cambian. Pruebas: tests/test_goa_accession_prefilter.py ejecuta cada GAF de tres formas: - el bucle de antes, copiado literalmente; - el actual con prefilter=False; - el actual con el filtro. Exige iguales los totales, la secuencia completa de eventos, los commits y las filas de cada INSERT. Lo hace sobre un GAF de casos límite con 56 combinaciones de page_size, total_limit y commit_every_page, y sobre 60 GAF aleatorios (2.000 semillas más pasaron en local). Otro test cuenta los records construidos, para que quitar `accept=` no pase en silencio. Pasan los 397 tests de los ficheros que tocan la carga de GOA, ruff, mypy de los dos módulos, check_smells y el resto de chequeos de lint.
|
Revisado el test, que era lo acordado, y aprobado. Dejo constancia de lo que comprobé y de lo que el test no puede probar por sí solo. El test hace lo que hace falta
Comparar La matriz es la correcta por donde duele:
Lo que verifiqué aparte, porque el test lo ejercita pero no lo declaraToda la aritmética de Lo probé contra Perezoso, uno por línea, en orden. El supuesto se sostiene, y Las dos vías juntas cierran el hueco: el test ejercita el plugin de verdad a través de Dos observaciones, ninguna bloqueante
Nota de contabilidad, para que quede en el registro: |
…ucción desde la release 175
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #998 +/- ##
===========================================
- Coverage 87.85% 87.81% -0.05%
===========================================
Files 306 330 +24
Lines 23414 25408 +1994
===========================================
+ Hits 20570 22311 +1741
- Misses 2844 3097 +253
🚀 New features to boost your workflow:
|
Qué cambia
load_goa_annotationspasa al plugin de GOA el predicadoacceptque protea-sources 0.2.1 ya trae en el lock (946227ca). Así el plugin no construye unGoaAnnotationRecordpara las líneas de proteínas que no están en el corpus. Son el 98%: en la 167, 385,0 M de 392,8 M líneas.La prueba de accesión es la misma de
_store_buffer, carácter a carácter:stripy pertenencia, y una accesión vacía se rechaza.Qué NO cambia
Todo lo que deja una carga sale igual: las filas de cada INSERT, la secuencia completa de eventos, los commits y todos los contadores del informe (
pages,total_lines_read,annotations_insertedy los tres cubos de rechazo).lines, en su página y ennot_in_universe, así que las páginas terminan en las mismas líneas.page_done.source.goa.download_donese retiene hasta colocar los rechazos finales, porque antes llegaba después de supage_done. Sitotal_limitcorta la carga, no se emite, igual que antes.Medido
En el nodo de cómputo (i5-12400F, Python 3.14), sobre las primeras 8 M líneas de la release 190, con
page_size200.000 y sesión mock. Es solo CPU, sin round trips a la base de datos:Sale 4,9x, con los mismos totales en las dos corridas: lines 7.999.992, inserted 14.834, not_in_universe 7.984.869 y 40 páginas.
La cabeza del fichero acepta el 0,19% de las líneas, menos que la media de una release, así que en una release completa la ganancia será algo menor. La cifra a nivel de job queda para cuando corra en el portátil.
Pruebas
tests/test_goa_accession_prefilter.pyejecuta cada GAF de tres formas:prefilter=False;Exige iguales totales, eventos, commits y filas. Lo hace sobre:
page_size,total_limitycommit_every_page;Otro test cuenta los records construidos, para que quitar
accept=no pase en silencio.Además pasan:
ruff check protea scripts;check_smells.py, sin escribir baseline: el bucle sale a_goa_pages.py, como el informe salió a_goa_load_report.py;Auto-merge desactivado: la sesión del portátil revisa el test diferencial antes del merge, porque su contabilidad es la evidencia de que las releases cargadas valen.