Опитвам се да чета и манипулирам данните, които азса се съхранявали в големи масиви от данни. Всеки файл е около 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
.