/ / Четене на големи файлове в рамки от данни в R - Проблеми с sqldf - r, памет, bigdata

Четене на големи файлове в рамки на данни в R - проблеми с sqldf - r, памет, bigdata

Опитвам се да чета и манипулирам данните, които азса се съхранявали в големи масиви от данни. Всеки файл е около 5GB. Най-вече трябва да мога да взема части от конкретни данни от тези набори от данни. Имам и подобен 38 MB файл, който използвам за тестване. Първоначално използвах read.table, за да чета на парчета от файла, използвайки „nrows“ и „skip“. Този процес обаче отнема огромно време, тъй като актът за прескачане на все по-голямо количество редове отнема много време. Ето кода, който имах:

numskip = 0 #how many lines in the file to skip
cur_list = read.table("file.txt", header = TRUE, sep = ",",nrows = 200000, skip = numskip, col.names = col) #col is a vector of column names

Зададох това в рамките на известно време и увеличавам numskip, за да вземем следващия парче данни, но с увеличаването на numskip процесът се забави значително.

Накратко се опитах да използвам read.lines за четене в данни ред по ред, но няколко нишки ме насочиха към пакета sqdl. Написах следния бит код:

library(sqldf)
f = file("bigfile.txt")
dataset = sqldf("select * from f where CusomterID = 7127382") #example of what I would like to be able to grab

От това, което разбирам, sqldf ще ми позволи да използвам SQL заявки за връщане на набори от данни от базата данни, без R да правя нищо, при условие че подмножеството не е твърде голямо, за да може R да се справи.

Проблемът е, че моята 4GB машина изчерпвапамет, когато пускам големите файлове (макар и не по-малкият тестов файл). Намерих това странно, защото знам, че SQLite може да обработва много по-големи файлове от 5 GB и R не трябва да се занимава с никаква обработка. Бих ли използвал PostGreSQL помощ? Трябва ли ми само по-добра машина с повече RAM? Трябва ли да се откажа от sqldf и да намерите различен начин да направите това?

За да приключите това, ето пример за данните, с които работя:

"Project" "CustomerID" "Stamp" "UsagePoint" "UsagePointType" "Energy"
21           110981       YY         40            Red          0.17
21           110431       YY         40            Blue         0.19
22           120392       YY         40            Blue         0.20
22           210325       YY         40            Red          0.12

Благодаря

Отговори:

1 за отговор № 1

Опитвали ли сте се

dat <- read.csv.sql(file = "file.txt", "select * from file where CusomterID = 7127382")

0 за отговор № 2

Прав си за това sqldf и има много други големи инструменти за големи данни в R, включително big.memory.

Преобразувания в csv или json може да помогне (употреба RJSONIO) и можете също първо да заредите данните си в релационна, NoSQL, Hadoop или Hive база данни и да ги прочетете чрез RODBC, това е, което горещо препоръчвам във вашия случай.

Вижте също fread и CRAN HPC Taskview.