簡體   English   中英

逐漸在磁盤上增加ffdf數據幀

[英]Grow a ffdf data frame on disk gradually

從save.ffdf的文檔:

使用'save.ffdf'自動將'ff'向量的'終結器'設置為''close''。 這意味着當刪除對象或關閉R會話時,數據將保留在磁盤上。 可以使用“刪除”刪除數據,也可以刪除保存對象的目錄('dir')。

我想從一個小的ffdf數據幀開始,一次添加一些新數據,並在磁盤上增長它。 所以我做了一個小實驗:

# in R
ffiris = as.ffdf(iris)
save.ffdf(ffiris, dir = "~/Desktop/iris")

# in bash
ls ~/Desktop/iris/
## ffiris$Petal.Length.ff ffiris$Petal.Width.ff  ffiris$Sepal.Length.ff ffiris$Sepal.Width.ff  ffiris$Species.ff

# in R
# add a new column
ffiris =transform(ffiris, new1 = rep(99, nrow(iris)))
rm(ffiris)

# in bash
ls ~/Desktop/iris/
## ffiris$Petal.Length.ff ffiris$Petal.Width.ff  ffiris$Sepal.Length.ff ffiris$Sepal.Width.ff  ffiris$Species.ff

事實證明,當我刪除ffiris時,它不會自動更新磁盤上的ff數據。 怎么樣手動保存?

# in R
# add a new column
ffiris =transform(ffiris, new1 = rep(99, nrow(iris)))
save.ffdf(ffiris, "~/Desktop/iris")

# in bash
ls ~/Desktop/iris/
## ffiris$Petal.Length.ff ffiris$Petal.Width.ff  ffiris$Sepal.Length.ff ffiris$Sepal.Width.ff  ffiris$Species.ff

嗯,還是沒有運氣。 為什么?

如何在保存之前刪除文件夾?

# in R
ffiris = as.ffdf(iris)
unlink("~/Desktop/iris", recursive = TRUE, force = TRUE)
save.ffdf(ffiris, "~/Desktop/iris", overwrite = TRUE)
ffiris =transform(ffiris, new1 = rep(99, nrow(iris)))
unlink("~/Desktop/iris", recursive = TRUE, force = TRUE)
save.ffdf(ffiris, "~/Desktop/iris", overwrite = TRUE)

# in bash
ls ~/Desktop/iris/
# ls: /Users/ky/Desktop/iris/: No such file or directory

更奇怪的是。 即使這一切都奏效,它仍然會非常低效。 我正在尋找類似的東西:

updateOnDisk(ffiris)

有人可以幫忙嗎?

ffffbase提供了內存R向量,但引入了一個引用語義,它可以給出R語言的問題。

R是一種函數式編程語言,這意味着函數不會更改參數和對象,而是返回修改后的副本。 ffbase我們以R方式實現函數,即transform返回原始ffdf data.frame的副本。 通過查看文件名可以看出這一點:

ffiris = as.ffdf(iris)
save.ffdf(ffiris, dir = "~/Desktop/iris")
filename(ffiris) # show contents of ~/Desktop/iris

ffiris =transform(ffiris, new1 = 99) # this create a copy of the whole data.frame!
filename(ffiris)  

ffiris$new2 <- ff(rep(99, nrow(iris)))  # this creates a new column, but not yet in the right directory
filename(ffiris)

save.ffdf(ffiris, dir="~/Desktop/iris", overwrite=TRUE) # this fixes that.

轉換目前添加新列效率很低,因為它復制整個數據幀(即R語義)。 這是因為變換可能是一個臨時結果,您不會改變原始數據。

在ffbase2中我們正在解決這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM