@memoize on VariantCollection.original_reference_names returns another (equal) collection's result and keeps every collection alive
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
Direzione di ricerca
Leggi varcode/variant_collection.py in corrispondenza di reference_names() e original_reference_names(), poi esamina la posizione del test di regressione e i tre usi di memoize in reference.py. Riproduci il problema con varianti equivalenti create usando genome="hg19" e genome="GRCh37"; il lavoro è terminato quando ogni collezione restituisce il proprio nome di riferimento originale e la cache non conserva più istanze di collezioni.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
VariantCollection.reference_names() and VariantCollection.original_reference_names() are decorated with varcode.common.memoize. That decorator is a hand-written cache: a module-level dict keyed by the call's arguments, which here means self. This causes two problems.
-
Wrong results. Equal collections share one cache entry:
- sercol collections hash by length and compare element by element.
Variant.__eq__compares the resolvedgenome, notoriginal_reference_name.
So the same calls loaded from an hg19 VCF and from a GRCh37 VCF are equal collections. Whichever is asked first fills the cache, and the other gets its answer:
original_reference_names()returns{"GRCh37"}for the hg19 collection, or{"hg19"}for the GRCh37 one. -
Memory. The cache keeps a strong reference to every collection it has seen, for the life of the process. #133 (open since 2016) asks to stop memoizing methods in a global dict. These two methods are the remaining instances.
Both methods are a single set comprehension over the variants, so they don't need a cache at all.
Evidence
Read at varcode 96dc77b and sercol b0b8848.
varcode/common.py:57-75,memoize: a dict keyed by(args, sorted kwargs).varcode/variant_collection.py:314-337:@memoizeonreference_namesandoriginal_reference_names.- sercol
sercol/collection.py:228-240:__hash__returnshash(len(self)), and__eq__compares class, length and elements. varcode/variant.py:290-301:Variant.__eq__compares contig, start, end, ref, alt and genome.varcode/variant.py:170-178:original_reference_nameis the UCSC name (hg19) when the genome was given that way, and the Ensembl name otherwise.infer_genomeresolves bothhg19andGRCh37to the same release object.- The other uses of
memoizedecorate module functions with string arguments (reference.py:135,:270,:349).functools.cachedoes the same job there.
Suggested fix
- Remove
@memoizefrom both methods. - Use
functools.cacheat the three uses inreference.py, and deletevarcode.common.memoize. - Add a regression test. Build the same small variants with
genome="hg19"and withgenome="GRCh37", calloriginal_reference_names()on one collection, then check the other's result.
- Lingua principale
- Python
- Stelle
- 88
- Fork
- 28
- Merge medio
- 4h 48m
- PR unite (30g)
- 62
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di openvax/varcode
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 67/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 58/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
openvax/varcode#731 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di openvax/varcode
Issue simili
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 88/100
aws-samples/sample-per-model-bedrock#857 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 70/100
521xueweihan/HelloGitHub#4328 ·
-
documentation maintainer-managed
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
awslabs/visual-asset-management-system#1418 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 84/100
I maintainer di solito rispondono entro 1 giorno