Proposal: String representation/RleMatrix
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 25/100
- Issue-Typ
- Feature
- Klarheit
- Muss geklärt werden
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- r
- Bereich
- bioinformatics
Rechercherichtung
Beginne mit dem reproduzierbaren R-Beispiel des Issues und prüfe, wie CollapsedVcf-Assays dargestellt werden, insbesondere list-matrices sowie das Verhalten von DelayedArrays RleArray/RleMatrix. Der Vorschlag benötigt vor der Implementierung eine abgestimmte Repräsentation und einen Kompatibilitätsplan; abgeschlossen wäre die Arbeit mit einem bestätigten Design, das den Speicherverbrauch reduziert, ohne Informationen zu verlieren, und gegen die betroffenen Workflows validiert ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
I'd like to propose a couple of potential optimisations, particularly useful for cases where many entries are the same (e.g. AD: NA NA for GT: "./."). I'm working with a file which compresses nicely to .rds (~40MB) but is very large when in memory (17GB). This size becomes difficult to work with on a local machine or interactively.
Looping over the individual assays in a CompressedVcf I see that the largest ones are those which are matrices of lists (e.g. AD, AF, MBQ, ...). In theory (I think) they contain the same scale of information as GT, but their representation makes them much larger.
I appreciate that this list format makes working with the data cleaner than storing the entries as delimited strings (as I believe they natively are in the VCF) which likely requires parsing the string and splitting into a list-like structure anyway, but this is a tradeoff between size and usability, and applies to the entire dataset even if a user is only interested in a subset.
Would there be interest in a representation of CollapsedVcf list-matrices as either delimited strings (in which case they could be stored as RleMatrix for an additional compression boost; or RleListMatrix (which doesn't exist, but here's an open issue: https://github.com/Bioconductor/DelayedArray/issues/62)? I'm not well-versed enough in the Rle side to know if Rle provides a benefit when stored in a list, but it's an option.
Below is a comparison of object sizes for a toy example 'assay' constructed as a matrix of list elements and the size savings are potentially very large (in this case 1/62 the size).
## create a matrix of list elements
x <- matrix(
replicate(
2e4,
c(
sample(c(NA, 1, 2), 1, prob = c(100, 1, 1)),
sample(c(NA, 1, 2), 1, prob = c(100, 1, 1))
),
simplify = FALSE),
ncol = 10
)
head(x)
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#> [1,] Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
#> [2,] Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
#> [3,] Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
#> [4,] Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
#> [5,] Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
#> [6,] Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2 Numeric,2
#> [,8] [,9] [,10]
#> [1,] Numeric,2 Numeric,2 Numeric,2
#> [2,] Numeric,2 Numeric,2 Numeric,2
#> [3,] Numeric,2 Numeric,2 Numeric,2
#> [4,] Numeric,2 Numeric,2 Numeric,2
#> [5,] Numeric,2 Numeric,2 Numeric,2
#> [6,] Numeric,2 Numeric,2 Numeric,2
## collapse to singleton strings (credit: @lawremi)
v <- unlist(x)
v[is.na(v)] <- "."
x_str <- matrix(
S4Vectors::unstrsplit(
c(relist(v, x)), ","),
nrow(x), ncol(x))
head(x_str)
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,."
#> [2,] ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,."
#> [3,] ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,."
#> [4,] ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,."
#> [5,] ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,."
#> [6,] ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,." ".,."
suppressMessages(library(DelayedArray))
## Rle representation of matrix of list doesn't work
as(x, "RleArray")
#> Error in .Call2("Rle_constructor", values, lengths, PACKAGE = "S4Vectors"): Rle of type 'list' is not supported
## Rle representation of string matrix
x_rle <- as(x_str, "RleArray")
x_rle
#> <2000 x 10> matrix of class RleMatrix and type "character":
#> [,1] [,2] [,3] ... [,9] [,10]
#> [1,] ".,." ".,." ".,." . ".,." ".,."
#> [2,] ".,." ".,." ".,." . ".,." ".,."
#> [3,] ".,." ".,." ".,." . ".,." ".,."
#> [4,] ".,." ".,." ".,." . ".,." ".,."
#> [5,] ".,." ".,." ".,." . ".,." ".,."
#> ... . . . . . .
#> [1996,] ".,." ".,." ".,1" . ".,." ".,."
#> [1997,] ".,." ".,." ".,." . "2,." ".,."
#> [1998,] ".,." ".,." ".,." . ".,." ".,."
#> [1999,] "1,." ".,." "1,." . ".,." ".,."
#> [2000,] "2,." ".,." ".,." . ".,." ".,."
## compare sizes
pryr::object_size(x)
#> Registered S3 method overwritten by 'pryr':
#> method from
#> print.bytes Rcpp
#> 1.44 MB
pryr::object_size(x_str)
#> 161 kB
pryr::object_size(x_rle)
#> 23 kB
Created on 2020-02-28 by the reprex package (v0.3.0)
I'm not across this package enough to have any insights into implementation issues or how this might affect other aspects of the inner workings (or user-side workings) but this approach reduces a 1.71GB CollapsedVcf into a 20MB object of the same class without destroying any information. Credit to @lawremi for guidance towards optimising the conversion and on structural advice.
- Vorherrschende Sprache
- R
- Sterne
- 32
- Forks
- 21
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus Bioconductor/VariantAnnotation
-
refactor the packageOffen
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 25/100
Bioconductor/VariantAnnotation#115 · 4 Kommentare ·
-
what is the "covr" condition of this package?Evtl. vergeben @vjcitn hat das vor 86 Tagen übernommen. Offen
Bioconductor/VariantAnnotation#114 · 1 Reaktion · 2 zugewiesene Personen ·
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 35/100
Bioconductor/VariantAnnotation#113 · 2 Kommentare ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 35/100
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 30/100
Bioconductor/VariantAnnotation#88 · 2 Kommentare ·
Alle Issues in Bioconductor/VariantAnnotation
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 90/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
OHDSI/CohortSymmetry#369 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Open-Systems-Pharmacology/OSPSuite.ParameterIdentification#330 ·