最有效的方式导出大型(3.9mill obs)数据。帧到文本文件?[复制]
-
13-12-2019 - |
题
我在R中有一个相当大的dataframe,我想导出到SPSS。这个文件给我带来了几个小时的头痛,试图将它导入到R中,但是我成功地使用了 read.fwf()
使用选项 comment.char="%"
(文件中没有出现的字符)和 fill= TRUE
(这是一个固定宽度的ASCII文件,其中一些行缺少所有变量,导致错误消息)。
无论如何,我的数据框目前由3,9个mill观测值和48个变量(所有字符)组成。我可以通过将其拆分为4x1mill obs集来相当快地将其写入文件 df2 <- df[1:1000000,]
其次是 write.table(df2)
等。,但如果没有计算机锁定并且需要硬重置才能恢复,则无法在一次扫描中写入整个文件。
在听到关于R如何不适合大型数据集多年的轶事故事之后,这是我第一次真正遇到这种问题。我想知道是否有其他方法(低级别"转储"文件直接到磁盘?)或者是否有一些我不知道的软件包可以有效地处理这种类型的大文件的导出?
解决方案
猜测一下,你的机器内存不足,所以R不得不使用交换文件,这会减慢速度。如果您正在支付代码费用,那么购买更多RAM可能会比您编写新代码更便宜。
也就是说,有一些可能性。您可以将文件导出到数据库,然后使用该数据库的工具写入文本文件。JD Long的回答 这个问题 告诉你如何以这种方式在文件中读取;扭转这个过程不应该太困难。或者, bigmemory
和 ff
软件包(如Davy所述)可用于编写此类文件。
其他提示
1)如果你的文件是所有的字符串,那么它保存使用 write.table()
如果你先把它改成一个 matrix
.
2)也把它写成大块,比如1000000行,但总是写到同一个文件中,并使用参数 append = TRUE
.
更新资料
经过Matt Dowle的广泛工作,并行化并增加其他效率改进, fread
现在比以前快15倍。 write.csv
.有关更多信息,请参阅链接答案。
现在 data.table
有一个 fwrite
奥托*塞斯卡里贡献的功能似乎是奥托*塞斯卡里的两倍。 write.csv
在一般情况下。见 这里 对于一些基准。
library(data.table)
fwrite(DF, "output.csv")
请注意,行名被排除在外,因为 data.table
类型不使用它们。
虽然我只用它来读取非常大的文件(10+Gb),但我相信 ff
包具有写入非常大的dfs的功能。
那么,对于真正大的文件和R的答案通常是,最好将这种工作卸载到数据库中。SPSS具有ODBC连接,并且 RODBC
提供从R到SQL的接口。
我注意到,在检查我的信息的过程中,我被挖走了。