Pros:

Cons:

ff package is responsible for data structures & manipulations mainly.
ffbase is responsible for computations mainly.

To process data in appropiate manner all data must be converted to types as follows:

library(ff)
library(ffbase)
rm(list=ls())
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  787739 42.1    5438107 290.5   9493837  507.1
Vcells 5389718 41.2   33430281 255.1 153274983 1169.4
#make the initial data frame
df_size <- 50000000
x <- data.frame(a = numeric(df_size), b = numeric(df_size), c = numeric(df_size))
print(paste(round(object.size(x)/1024/1024,2),"Mb"))
[1] "1144.41 Mb"
#convert to ffdf object
system.time(
  x1<-as.ffdf(x)
)
   user  system elapsed 
   2.27    3.81  264.36 
#save df as ffdf object to the file
system.time(
  
  write.csv2.ffdf(x1,"ff_test.csv")
)
   user  system elapsed 
 365.16    6.16  568.69 

NB:

ffdf, ff, ff_vector could be as a standard vectors or dataframes but with the loss of its main advantage (no-RAM allocations).

Let’s scan through the brief example:

rm(list=ls())
gc()
          used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  787516 42.1    3965509  211.8   9493837  507.1
Vcells 5389355 41.2  265730432 2027.4 255390158 1948.5
#read the raw data as ffdf object
system.time(
  
  recovery <- read.csv2.ffdf(file="ff_test.csv"
                              , header = TRUE
                              , first.rows=10000
                              , next.rows=1000000
                              ,levels=NULL
                              )
  
)
   user  system elapsed 
  52.87    1.83   87.31 
#the size of the ffdf object
paste("ffdf object size:", round(object.size(recovery)/1024/1024,2),"Mb")
[1] "ffdf object size: 0.01 Mb"
#the type & size of the column from ffdf object with indexing
class(recovery[,1])
[1] "integer"
paste("recovery[,1]:",round(object.size(recovery[,1])/1024/1024,2),"Mb")
[1] "recovery[,1]: 190.73 Mb"
#the type & size of the column from ffdf object with column name
class(recovery$a)
[1] "ff_vector" "ff"       
paste("recovery$a:",round(object.size(recovery$a)/1024,2),"kb")
[1] "recovery$a: 3.12 kb"

To monitor the RAM allocations in standard and ffdf calculations is recommended to run a tool to monitor RAM allocations such as Windows Task Manager.

mean_standard <- mean(recovery[,1])
rm(mean_standard)
gc()
          used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  787566 42.1    2537925  135.6   9493837  507.1
Vcells 5389376 41.2  170067476 1297.6 255390158 1948.5
mean_ff <- mean(recovery$a)
rm(mean_ff)
gc()
          used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  787566 42.1    2537925  135.6   9493837  507.1
Vcells 5389376 41.2  136053980 1038.1 255390158 1948.5

Example of manipulation with columns of ffdf object:

system.time(
  
  within(recovery, {a <- a+5
            #print(mean(a))
          }
        )
  
)
   user  system elapsed 
  66.35    1.56  119.12 
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  787625 42.1    6380318 340.8   9493837  507.1
Vcells 5389489 41.2   44582167 340.2 255390158 1948.5

Summary:

The package is quite usefull. However it can require some tuning in specific cases. Tuning means the reaction of script and RAM for the specific task.

LS0tDQp0aXRsZTogIk91dC1vZi1tZW1vcnkgcGFja2FnZXMgKGZmLCBmZmJhc2UpIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6IERlbXlkIER6eXViYW4NCmRhdGU6IDE2LzEyLzIwMTYNCi0tLQ0KDQoNCiMjIyMgKipQcm9zOioqICANCg0KKiBUaGUgaWRlYSBvZiB0aGUgcGFja2FnZXMgaXMgdG8gaGFuZGxlIGxhcmdlIHZvbHVtZXMgb2YgZGF0YSB3aXRob3V0IGFsbG9jYXRpb24gb2YgdGhlIGZ1bGwgc2l6ZSBSQU0gY2FwYWNpdGllcy4NCg0KKiBTbyB0aGUgZmlsZSBvZiBzZXZlcmFsIEdicyBzaXplIHdpbGwgYmUgc3F1ZWV6ZWQgYWN0dWFsbHkgZG93biB0byBzZXZlcmFsIE1icyBvciBldmVuIEticy4gDQoNCiogVGhlIG9ubHkgbWV0YWRhdGEgYXJlIGFsbG9jYXRlZCB0byB0aGUgUkFNLiANCg0KKiBUaGUgcGh5c2ljYWwgZGF0YSBhcmUgc3RvcmVkIGFuZCBtYW5pcHVsYXRlZCBvbiB0aGUgZXh0ZXJuYWwgdG9vbHMgKGZvciBpbnN0YW5jZSwgSEREIG9yIFNTRCkuDQoNCg0KDQojIyMjICoqQ29uczoqKiANCg0KKiBEYXRhIG1hbmlwdWxhdGlvbiAmIGNhbGN1bGF0aW9uIHRyYWRlLW9mZnM7DQoNCiogSGFyZHdhcmUgJiBkYXRhIGNvbnNpc3RlbmN5L2ludGVncml0eSBpc3N1ZXM7DQoNCiogUGVyZm9ybWFuY2UgZGVjcmVhc2UgaXNzdWVzIG9mIHRoZSB3b3Jrc3RhdGlvbi4gIA0KICAgDQogICAgDQoqKmZmIHBhY2thZ2UqKiBpcyByZXNwb25zaWJsZSBmb3IgZGF0YSBzdHJ1Y3R1cmVzICYgbWFuaXB1bGF0aW9ucyBtYWlubHkuICANCioqZmZiYXNlKiogaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGF0aW9ucyBtYWlubHkuDQogIA0KDQoNClRvIHByb2Nlc3MgZGF0YSBpbiBhcHByb3BpYXRlIG1hbm5lciBhbGwgZGF0YSBtdXN0IGJlIGNvbnZlcnRlZCB0byB0eXBlcyBhcyBmb2xsb3dzOiAgDQoNCiogZmYgKHZlY3RvcikNCg0KKiBmZl92ZWN0b3IgKHZlY3RvcikNCg0KKiBmZmRmICh0YWJsZS9kYXRhZnJhbWUpDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGZmKQ0KbGlicmFyeShmZmJhc2UpDQoNCnJtKGxpc3Q9bHMoKSkNCmdjKCkNCg0KYGBgDQoNCg0KYGBge3J9DQojbWFrZSB0aGUgaW5pdGlhbCBkYXRhIGZyYW1lDQpkZl9zaXplIDwtIDUwMDAwMDAwDQp4IDwtIGRhdGEuZnJhbWUoYSA9IG51bWVyaWMoZGZfc2l6ZSksIGIgPSBudW1lcmljKGRmX3NpemUpLCBjID0gbnVtZXJpYyhkZl9zaXplKSkNCnByaW50KHBhc3RlKHJvdW5kKG9iamVjdC5zaXplKHgpLzEwMjQvMTAyNCwyKSwiTWIiKSkNCg0KDQojY29udmVydCB0byBmZmRmIG9iamVjdA0Kc3lzdGVtLnRpbWUoDQogIHgxPC1hcy5mZmRmKHgpDQopDQoNCiNzYXZlIGRmIGFzIGZmZGYgb2JqZWN0IHRvIHRoZSBmaWxlDQpzeXN0ZW0udGltZSgNCiAgDQogIHdyaXRlLmNzdjIuZmZkZih4MSwiZmZfdGVzdC5jc3YiKQ0KDQopDQoNCg0KYGBgDQoNCiMjIyMgKipOQjoqKiAgDQoNCmZmZGYsIGZmLCBmZl92ZWN0b3IgY291bGQgYmUgYXMgYSBzdGFuZGFyZCB2ZWN0b3JzIG9yIGRhdGFmcmFtZXMgYnV0IHdpdGggdGhlIGxvc3Mgb2YgaXRzIG1haW4gYWR2YW50YWdlIChuby1SQU0gYWxsb2NhdGlvbnMpLg0KDQpMZXQncyBzY2FuIHRocm91Z2ggdGhlIGJyaWVmIGV4YW1wbGU6DQoNCmBgYHtyfQ0Kcm0obGlzdD1scygpKQ0KZ2MoKQ0KYGBgDQoNCmBgYHtyfQ0KDQojcmVhZCB0aGUgcmF3IGRhdGEgYXMgZmZkZiBvYmplY3QNCnN5c3RlbS50aW1lKA0KICANCiAgcmVjb3ZlcnkgPC0gcmVhZC5jc3YyLmZmZGYoZmlsZT0iZmZfdGVzdC5jc3YiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGhlYWRlciA9IFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZmlyc3Qucm93cz0xMDAwMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXh0LnJvd3M9MTAwMDAwMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGxldmVscz1OVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogIA0KKQ0KYGBgDQoNCmBgYHtyfQ0KI3RoZSBzaXplIG9mIHRoZSBmZmRmIG9iamVjdA0KcGFzdGUoImZmZGYgb2JqZWN0IHNpemU6Iiwgcm91bmQob2JqZWN0LnNpemUocmVjb3ZlcnkpLzEwMjQvMTAyNCwyKSwiTWIiKQ0KDQojdGhlIHR5cGUgJiBzaXplIG9mIHRoZSBjb2x1bW4gZnJvbSBmZmRmIG9iamVjdCB3aXRoIGluZGV4aW5nDQpjbGFzcyhyZWNvdmVyeVssMV0pDQpwYXN0ZSgicmVjb3ZlcnlbLDFdOiIscm91bmQob2JqZWN0LnNpemUocmVjb3ZlcnlbLDFdKS8xMDI0LzEwMjQsMiksIk1iIikNCg0KI3RoZSB0eXBlICYgc2l6ZSBvZiB0aGUgY29sdW1uIGZyb20gZmZkZiBvYmplY3Qgd2l0aCBjb2x1bW4gbmFtZQ0KY2xhc3MocmVjb3ZlcnkkYSkNCnBhc3RlKCJyZWNvdmVyeSRhOiIscm91bmQob2JqZWN0LnNpemUocmVjb3ZlcnkkYSkvMTAyNCwyKSwia2IiKQ0KDQpgYGANCg0KVG8gbW9uaXRvciB0aGUgUkFNIGFsbG9jYXRpb25zIGluIHN0YW5kYXJkIGFuZCBmZmRmIGNhbGN1bGF0aW9ucyBpcyByZWNvbW1lbmRlZCB0byBydW4gYSB0b29sIHRvIG1vbml0b3IgUkFNIGFsbG9jYXRpb25zIHN1Y2ggYXMgV2luZG93cyBUYXNrIE1hbmFnZXIuDQoNCmBgYHtyfQ0Kc3lzdGVtLnRpbWUoDQogIG1lYW5fc3RhbmRhcmQgPC0gbWVhbihyZWNvdmVyeVssMV0pDQopDQoNCnJtKG1lYW5fc3RhbmRhcmQpDQpnYygpDQoNCmBgYA0KDQpgYGB7cn0NCg0Kc3lzdGVtLnRpbWUoDQogIG1lYW5fZmYgPC0gbWVhbihyZWNvdmVyeSRhKQ0KKQ0KDQpybShtZWFuX2ZmKQ0KZ2MoKQ0KDQpgYGANCg0KDQojIyMjICpFeGFtcGxlIG9mIG1hbmlwdWxhdGlvbiB3aXRoIGNvbHVtbnMgb2YgZmZkZiBvYmplY3Q6KiAgDQoNCmBgYHtyfQ0Kc3lzdGVtLnRpbWUoDQogIA0KICB3aXRoaW4ocmVjb3ZlcnksIHthIDwtIGErNQ0KICAgICAgICAgICAgI3ByaW50KG1lYW4oYSkpDQogICAgICAgICAgfQ0KICAgICAgICApDQogIA0KKQ0KDQpnYygpDQoNCmBgYA0KDQojIyMgKipTdW1tYXJ5OioqDQoNClRoZSBwYWNrYWdlIGlzIHF1aXRlIHVzZWZ1bGwuIA0KSG93ZXZlciBpdCBjYW4gcmVxdWlyZSBzb21lIHR1bmluZyBpbiBzcGVjaWZpYyBjYXNlcy4gVHVuaW5nIG1lYW5zIHRoZSByZWFjdGlvbiBvZiBzY3JpcHQgYW5kIFJBTSBmb3IgdGhlIHNwZWNpZmljIHRhc2suIA0KDQo=