2015-08-22 4 views
4

Мне нужно загрузить zps-файл csv из Интернета, разархивировать его и загрузить в память как data.frame. Есть ли способ закончить весь процесс в памяти только без чтения/записи диска? Вот что я пробовал:Разархивировать необработанный файл в памяти в R

library(RCurl) 
file <- getURL(url, userpwd='user:pwd') 
tf <- tempfile() 
writeBin(content(file, "raw"), tf) 
tf <- unzip(tf, exdir=tempdir()) 
data <- read.csv(tf) 
unlink(tf) 

Я думаю writeBin, unzip и read.csv здесь использовать дорогой диск I/O, но я не знаю, как улучшить его.

+0

Я был бы очень удивлен, что латентность, связанная с записью и распаковкой файла, медленнее, чем первоначальная загрузка? Но вы можете попробовать функцию 'unz()'. –

+0

@ ForrestR.Stevens, можете ли вы подробнее объяснить, как использовать функцию 'unz' для выполнения этой задачи? Для меня это не тривиально. – Bamqf

ответ

0

Я думаю, что этот пример, используя unz(), доставит вас куда ближе, открыв соединение с одним файлом в вашем Zip-архиве, хотя я был бы удивлен, если функция unz() на самом деле не распаковывает диск, я его не проверял :

## Create a sample data.frame object: 
d <- data.frame(a=rnorm(40), b=rnorm(40)) 

## Write this data.frame to two separate CSV files, and zip 
## them together into a new archive: 
write.csv(d, file="d.csv") 
write.csv(d, file="d_2.csv") 
zip("d.zip", c("d.csv", "d_2.csv")) 

## In this case, we will open a file connection to a single file 
## inside the zip archive, and read the data in using read.csv(): 
f <- unz("d.zip", "d_2.csv") 
a <- read.csv(f) 
head(a) 
+0

В моей системе 7 '' zip' функция выдает 'Предупреждающее сообщение: запущенная команда '" zip "-r9X" d.zip "" d.csv "" d_2.csv "' имеет статус 127', тогда' unz' не может откройте соединение. Является ли это воспроизводимой ошибкой? – Bamqf

+0

Ну, у вас не должно быть установленного приложения Zip, доступного в системе PATH ... Вы можете установить Rtools и убедиться, что 'Rtools/bin' находится в вашем PATH (который вы можете проверить за запуском следующего:' shell («PATH»)) или просто проверить функцию в вашем собственном Zip-файле, а не создавать ее с помощью моего сценария? –

+0

Я попытался, и кажется, что unz не распаковывает на диск, но я все еще не могу заставить его извлекать данные из url вместо локального zip-файла, особенно в моем случае с именем пользователя и паролем, и оба они имеют «@», что смущает URL-адрес синтаксический анализатор. – Bamqf

Смежные вопросы