R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Suurten tekstitiedostojen käsittely sqldf-paketilla

Suurten (taulukkomuotoisten) tekstitiedostojen käsittely R:ssä käy näppärimmin, jos tiedoston saa kokonaisuudessaan ladattua muistiin. Aina tämä ei kuitenkaan ole mahdollista, mutta jos levytilaa on kuitenkin tarpeeksi, voi tiedostosta tehdä esimerkiksi SQLite-tietokannan, ja tehdä hakuja siitä. SQLite on siitä näppärä tietokantamoottori, ettei se vaadi erillistä asennusta, vaan sen saa helposti asentamalla RSQLIte-paketin. Paketilla sqldf voi puolestaan tehdä helposti SQLite-tietokannan tesktitiedostosta R:ssä.

Oletetaan, että tekstitiedoston nimi on data.txt, ja siitä muodostettavan tietokannan nimeksi tulee datadb. Datadb:n tauluun df luetaan tekstitiedoston sisältö. R:ssä homma toimii seuraavasti:

# Ladataan paketti
library(sqldf)
# Tietokanta syntyy polkuun:
setwd("C:/Users/Jarno Tuimala/Desktop")
# Luodaan tyhjä tietokanta datadb
sqldf("attach datadb as new")
# Luetaan tekstitiedosto tietokannan tauluksi df
read.csv.sql("C:\\Users\\Jarno Tuimala\\Desktop\\data.txt", sql = "create table df as select * from file", header=T, sep="\t", dbname = "datadb")

Muodostuva tietokanta on tyypillisesti kooltaan runsaasti suurempi kuin alkuperäinen tiedosto. Tietokannasta voidaan tehdä tavanomaisia SQL-hakuja vaikkapa pakettia RSQLite käyttäen seuraavasti:

setwd("C:/Users/Jarno Tuimala/Desktop")
library("RSQLite")
# Muodostetaan yhteys tietokantaan
con<-dbConnect("SQLite", "datadb")
# Tehdään haku SQL:llä
res<-dbSendQuery(con, 'select * from df where cylinder > 4')
# Noudetaan data objektiin dat
dat<-fetch(res, n=-1)
# Tarvittaessa tyhjennetään haun tulos
dbClearResult(res)

Suurimmat tekstitiedostot, joita olen tähän tyyliin käsitellyt ovat olleet useita kymmeniä gigatavuja eli nykykäsityksen mukaan edelleen varsin pieniä, mutta kuitenkin sellaisia, ettei niiden käsittely muistissa onnistu suoraan.


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *