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引擎。 @majomfwrite
现已合并到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