HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

Táblázatok tárolása (és gyors betöltése)

2018.03.02. 13:13 Travis.CG

Arról, miként nézzen ki egy táblázat, már írtam korábban, hogy miként tároljuk azokat, még nem esett szó. Erre több módszer is létezik, ezekből szemezgetnék párat a teljesség igénye nélkül. A következő teszteket a GTEx RNA-seq táblázatával próbáltam ki, ami 1.7GB méretű. Ezt bárki letöltheti és további próbákat tehet vele. Az oszlopok az EnsEMBL gén azonosítók, az oszlopok pedig a megszekvenált minták.

Szöveges állományok

Természetesen a legegyszerűbb megoldás, ha csak úgy hagyjuk őket, ahogy vannak. A legnépszerűbb megoldások a tabulátorral vagy pontosvesszővel elválasztott szövegek (a GTEx az előbbi). Ezeket R-ben például nagyon egyszerű betölteni.

d1 <- read.table("count.tsv", check.names = F, sep = "\t")

Ha viszont megnézzük, milyen sebességgel kerül a memóriába ez a fájl, már nem olyan vidám a helyzet. A tesztelésre használt gépen ez 217.721 másodpercet vett igénybe. A readr csomag sokat lendíthet az olvasási sebességen.

d2 <- read_table2("count.tsv")

Ez kevesebb, mint fele idő alatt dolgozza fel a táblázatot (90.63 mp). De mi a helyzet, ha a rendelkezésre álló memória nem teszi lehetővé, hogy mindent beolvassunk? Szerencsére erre is van megoldás. A bigmemory csomag segítségével nem csak beolvashatjuk a táblázatunkat, de olyan elemzéseket is végezhetünk, amelyek korábban lehetetlenek lettek volna a kevés memória miatt.

d3 <- read.big.matrix("count.tsv", header = T)

Ez igazi sebesség, 36.569 másodperc! De sajnos van egy nagy hátránya a tisztán szöveges adatnak. Először is a metainformációk kezelése nehézkes. Képzeljük csak el, ha csak az agyból származó mintákkal akarunk foglalkozni. Valahogy ki kéne őket szűrni, de ahhoz egy másik táblázatot kellene felhasználnunk.

Természetesen nem megoldhatatlan a probléma, de miért mi párosítsuk az adatokat, ha erre már létezik kész megoldás?

SQL adatbázisok

Ez az adattárolás teljesen más formája. Egyrészt a táblák közötti kereszt referenciák kezelése jóval egyszerűbb lesz, másrészt maguk a táblázatok formája át fog alakulni. Az SQL nem teszi lehetővé, hogy mátrixunkat sor-oszlop formában tároljuk. Át kell alakítani azt egy három oszlopos formába, ahol az első oszlop a sor azonosító, a második az oszlop azonosító, a harmadik pedig a cella értéke, jelen esetben a nyers expressziós érték:

gene sample count
ENSG00000223972.4 GTEX-1117F-0226-SM-5GZZ7 3
ENSG00000223972.4 GTEX-111CU-1826-SM-5GZYN 4

Elsőre talán bonyolultnak tűnik ez a tárolási módszer, de van egy előnye: többé nem kell két dimenzióba gondolkodnunk. A szöveges állományok esetén egy ha egy újabb dimenzióval szeretnénk bővíteni a táblázatot, akkor az rengeteg többlet munkával jár. SQL esetén mindez egy új oszlop felvételét jelenti.

Most már készíthetünk egy új táblát, amiben megfeleltetjük az EnsEMBL azonosítókat gén szimbólumoknak, adhatunk hozzájuk kromoszóma pozíciókat, bármit, amit szeretnénk. A semmit mondó minta azonosítókhoz is rendelhetünk további információkat, mint amilyen a páciens neme, a szövet típusa vagy a mintavétel ideje. Miként használhatjuk ezt R-ből?

Ha például MySQL-ben (vagy MariaDB-ben) csináljuk mindezt, akkor használhatjuk az RMySQL csomagot.

library(RMySQL)
con <- dbConnect(MySQL(), user="user", password="abc123", dbname="gtex", host="localhost")
rs <- dbSendQuery(con, "select * from count")
raw <- fetch(rs, n = -1)
count <- xtabs(count ~ gene + sample, data = raw)
count <- as.data.frame.matrix(count)

Sajnos ez a nagyfokú szabadság nincs jó hatással a sebességre. Bármilyen optimalizáció nélkül a fenti kódot kb. 10 perc után leállítottam, mert 32GB RAM mellett is swappelt.

NoSQL adatbázisok

Számomra igazi meglepetés, hogy nincs olyan NoSQL adatbázis, ami képes lenne GTeX mennyiségű adat tárolására. Természetesen, aki nagyon akarja, bele tudja erőltetni az adatokat bármibe, de a BigTable típusú adatbázisok alapesetben képtelenek kezelni több ezer oszlopot. A HBase 3-4 oszloppal boldogul hatékonyan. A Google-féle BigTable büszkén hirdeti, hogy 100 oszlop családdal is megbírkózik, míg a HyperTable max. 255-öt kezel. Ez meglepetés volt nekem.

Összegzés

Mikor elkezdtem ennek a posztnak az írását, abban reménykedtem, hogy a végén találok egy olyan megoldást, ami hatékonyan kezeli a nagy táblázatokat. A sok telepítés és próbálgatás után viszont úgy látom, egy ideig nem szabadulunk meg a jó öreg szöveges állományoktól. Akinek a fenti megoldásokon kívül jobb ötlete van, kommentben nyugodtan írja meg.

6 komment

Címkék: bioinformatika

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr1813674806

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

robertherczeg 2018.03.02. 14:41:50

Szia,

esetleg a data.table::fread() funkciója? Több blog posztban is megemlítik, hogy gyorsabb, mint readr hasonló funciója.

Kipróbálod? Kíváncsi vagyok, hogy mit mutat :)

Travis.CG 2018.03.02. 16:41:18

@robertherczeg: Kipróbáltam. Ugyan azon az adatszetten 14.315mp alatt tölti be az adatokat, de akadt egy probléma: sor neveket nem tud kezelni. Az oszopok számának meg kell egyeznie a fájl minden sorában.

robertherczeg 2018.03.02. 19:35:52

@Travis.CG Gyorsnak gyors :) Az oszlopos problémát elvileg a fill = TRUE meg kell, hogy oldja.

Kíváncsiságból kipróbáltam én is, amihez ezt töltöttem le:
GTEx_Analysis_2016-01-15_v7_RNASeQCv1.1.8_gene_reads.gct.gz

Az első 10000 sornál nem tapasztaltam semmilyen gondot, simán beolvasta. Ezután a teljes adatsort is beolvasta hiba nélkül.

Bár most vissza olvasva a bejegyzést nem vagyok benne biztos, hogy jó fájlt töltöttem le :/

Travis.CG 2018.03.05. 00:32:14

@robertherczeg: Jó fájlt töltöttél le, én nem írtam le, hogy a következő paranccsal kicsit alakítottam: zcat GTEX*gz | tail -n +3 | cut -f 1,3- | sed 's/Name\t//' >count.tsv

Travis.CG 2018.03.05. 00:47:49

@razZ0r: Mindig tanul valamit az ember.
süti beállítások módosítása