Сохранение плоского файла как базы данных SQL в R без загрузки 100% в ОЗУ - PullRequest
0 голосов
/ 14 июля 2020

Я надеюсь, что то, что я собираюсь написать, имеет смысл. Если вы посмотрите на

Как работать с большим csv-файлом размером 50 ГБ на языке r?

, вы узнаете, как запросить à la SQL, файл csv из R. В моем случае у меня есть огромное количество данных, хранящихся в виде больших (или больше, чем моя RAM) плоских файлов.

Я хотел бы сохранить, например, один из них как базу данных SQLite, не загружая его в память целиком. Представьте, что вы могли бы автоматически прочитать ограниченный фрагмент этого файла, который подходит для вашей оперативной памяти, сохранить его в SQL, затем освободить часть памяти, обработать следующий фрагмент и так далее, и так далее, пока весь файл не окажется в база данных. Возможно ли это в R? Если бы таблицу можно было хранить как тиббл, было бы еще лучше, но это не принципиально. Любое предложение приветствуется. Спасибо!

Ответы [ 2 ]

1 голос
/ 14 июля 2020

1) dbWriteTable dbWriteTable может читать файл в базе данных без прохождения R. База данных создается, если она еще не существует.

library(RSQLite)

cat("a,b\n1,2\n", file = "myfile.csv")  # create test file

con <- dbConnect(SQLite(), "mydb") 

dbWriteTable(con, "mytable", "myfile.csv")
dbGetQuery(con, "select count(*) from mytable")  # ensure it is there

dbDisconnect(con)

2) SQLite CLI В качестве альтернативы мы могли бы сделать это с помощью sqlite cli, который можно загрузить с сайта загрузки sqlite.

https://www.sqlite.org/download.html

Это не связано с R вообще при создании базы данных. mydb будет создан, если он не существует. Эта первая строка вводится в командной строке оболочки или cmd, и она предоставит свое собственное приглашение, в котором можно будет ввести оставшиеся строки.

sqlite3 mydb
.mode csv
.import myfile.csv mytable
.quit

3) Другая база данных Другой вариант - использовать базу данных, которая может читать файлы CSV прямо в нее. H2 имеет csvread, MySQL имеет load data infile и PostgreSQL имеет copy.

0 голосов
/ 14 июля 2020

По-видимому, для этого уже есть функция

https://raw.githubusercontent.com/inbo/inborutils/master/R/csv_to_sqlite.R

Я тестирую. Я не вижу индикатора выполнения, даже если выбран соответствующий параметр, но похоже, что работа выполнена.

...