用于R中大数据表的write.csv

我有一个data.table不是很大(2 GB),但由于某种原因write.csv需要很长时间才能写出来(我从来没有真正完成等待),似乎使用大量的RAM来做它。 我试图将data.table转换为data.table ,尽pipe这不应该做任何事情,因为data.table扩展data.frame 。 有没有人遇到过这个? 更重要的是,如果你用CtrlC来停止它,R似乎没有给回内存。

更新08.04.2016

最近已经将fwrite添加到data.table包的开发版本中。 它也同时运行(隐式)。

 # Install development version of data.table install.packages("data.table", repos = "https://Rdatatable.github.io/data.table", type = "source") # Load package library(data.table) # Load data data(USArrests) # Write CSV fwrite(USArrests, "USArrests_fwrite.csv") 

根据加速write.table性能的详细基准testing, fwrite速度比write.csv快了17倍(YMMV)。


更新15.12.2015

将来在data.table包中可能会有一个fwrite函数,请参阅: https : //github.com/Rdatatable/data.table/issues/580 。 在这个线程中,一个GIST被链接,它为这个函数提供了一个原型,加快了这个过程2倍(根据作者, https ://gist.github.com/oseiskar/15c4a3fd9b6ec5856c89)。

原文答案

我有同样的问题(试图写更大的CSV文件),并最终决定使用CSV文件。

我build议你使用SQLite,因为它比处理CSV文件要快得多:

 require("RSQLite") # Set up database drv <- dbDriver("SQLite") con <- dbConnect(drv, dbname = "test.db") # Load example data data(USArrests) # Write data "USArrests" in table "USArrests" in database "test.db" dbWriteTable(con, "arrests", USArrests) # Test if the data was correctly stored in the database, ie # run an exemplary query on the newly created database dbGetQuery(con, "SELECT * FROM arrests WHERE Murder > 10") # row_names Murder Assault UrbanPop Rape # 1 Alabama 13.2 236 58 21.2 # 2 Florida 15.4 335 80 31.9 # 3 Georgia 17.4 211 60 25.8 # 4 Illinois 10.4 249 83 24.0 # 5 Louisiana 15.4 249 66 22.2 # 6 Maryland 11.3 300 67 27.8 # 7 Michigan 12.1 255 74 35.1 # 8 Mississippi 16.1 259 44 17.1 # 9 Nevada 12.2 252 81 46.0 # 10 New Mexico 11.4 285 70 32.1 # 11 New York 11.1 254 86 26.1 # 12 North Carolina 13.0 337 45 16.1 # 13 South Carolina 14.4 279 48 22.5 # 14 Tennessee 13.2 188 59 26.9 # 15 Texas 12.7 201 80 25.5 # Close the connection to the database dbDisconnect(con) 

有关更多信息,请参阅web/packages/RSQLite/RSQLite.pdf

您也可以使用像http://sqliteadmin.orbmu2k.de/这样的软件访问数据库并将数据库导出到CSV等。;