write.csv 用于大型 data.table

Posted

技术标签:

【中文标题】write.csv 用于大型 data.table【英文标题】:write.csv for large data.table 【发布时间】:2012-08-14 09:12:48 【问题描述】:

我有一个不是很大(2 GB)的data.table,但由于某种原因write.csv 需要很长时间才能写出来(我实际上从未完成等待)并且似乎使用了大量内存来做。

我尝试将data.table 转换为data.frame,尽管这实际上不应该做任何事情,因为data.table 扩展了data.frame。有人遇到过这个吗?

更重要的是,如果你用 Ctrl-C 停止它,R 似乎不会回馈内存。

【问题讨论】:

这可能会帮助你***.com/questions/9703068/… 我同意,data.table 在这方面的表现应该与data.frame 一样。如果来自@Julias 的链接问题解决了它,请自行回答以关闭此问题。 data.table 的快速文件阅读器已提上日程,但不是作家。如果您需要,请提交功能请求。 这似乎是data.table 特定的。显式转换为data.frame 后,write.csv 工作正常。 只使用了 txt 文件,但认为它应该与 csv 文件相同。使用 ff 包。使用 as.ffdf 函数将您的数据表或数据框转换为 ffdf 数据框。然后尝试 write.csv.ffdf 函数。这个包使用硬盘内存并且使用很少的 RAM,这在处理大文件时很有用。 saveRDS 可以作为一个选项 【参考方案1】:

2019.01.07 更新

fwrite 自 2016 年 11 月 25 日起加入 CRAN。

install.packages("data.table")

更新 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")

根据speeding up the performance of write.table 下显示的详细基准测试,fwrite 比那里的write.csv (YMMV) 快约 17 倍。


2015 年 12 月 15 日更新

将来data.table 包中可能会有一个fwrite 函数,请参阅:https://github.com/Rdatatable/data.table/issues/580。 在这个线程中,链接了一个 GIST,它为这样的函数提供了一个原型,可以将处理速度提高 2 倍(根据作者的说法,https://gist.github.com/oseiskar/15c4a3fd9b6ec5856c89)。

原始答案

我遇到了同样的问题(尝试编写更大的 CSV 文件)并最终决定不使用 CSV 文件。

我建议您使用 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, i.e. 
# 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)

更多信息,请参阅http://cran.r-project.org/web/packages/RSQLite/RSQLite.pdf

您也可以使用http://sqliteadmin.orbmu2k.de/之类的软件来访问数据库并将数据库导出为CSV等。

--

【讨论】:

你不需要手动安装sqlite,如果你安装RSQLite包它会包含sqlite引擎。 @majom fwrite 现已合并到data.table/master(目前只有开发版);随时更新。 很高兴看到在 R 中读取/写入 csv 与 sql 的基准。这里有一个用于 python 中的 pandas:pandas.pydata.org/pandas-docs/stable/… 从那里看起来 hdf 比 sql 或 csv 快得多,并且 sql vs csv 并没有太大的不同(至少在熊猫中)。我所知道的最快的是羽毛:blog.rstudio.com/2016/03/29/feather

以上是关于write.csv 用于大型 data.table的主要内容,如果未能解决你的问题,请参考以下文章

使用等效的purrr ::: map迭代data.table

data.table 中的行条件列操作

R之data.table速查手册

R中按日期范围设置的子集data.table

来自 data.table 包的 fread 无法读取小数字

R Data.table 用于计算跨多列的汇总统计信息