将大型(3.9毫米数据库)数据框架导出到文本文件的最有效方法?

jan*_*ans 23 export r export-to-csv

我在R中有一个相当大的数据框,我想导出到SPSS.这个文件首先导致我尝试将其导入R的几个小时的麻烦,但是我read.fwf()使用选项comment.char="%"(文件中没有出现的字符)成功使用了fill= TRUE(它是一个固定宽度的ASCII文件,缺少某些行)所有变量,导致错误消息).

无论如何,我的数据框目前包括3,900个观察值和48个变量(所有字符).我可以通过将其分成4 x 1毫米集合df2 <- df[1:1000000,]后跟write.table(df2)等等来快速地将其写入文件,但是如果没有计算机锁定并且需要硬重置才能恢复,则无法在一次扫描中写入整个文件.

在听到关于R多年来不适合大型数据集的轶事故事后,这是我第一次遇到这类问题.我想知道是否有其他方法(将文件低级"直接"转储到磁盘?)或者是否有一些我不知道的包可以有效地处理这种类型的大文件的输出?

tim*_*ffe 24

1)如果您的文件是所有字符串,那么write.table()如果您首先将其更改为a ,则可以更快地保存matrix.

2)也将它写成1000000行的块,但总是写在同一个文件中,并使用参数append = TRUE.


Mic*_*ico 14

更新

经过Matt Dowle的广泛工作,并行化并增加了其他效率改进,fread现在比其快15倍write.csv.请参阅链接的答案了解更多


现在data.table有一个fwrite由Otto Seiskari贡献的功能,它的速度似乎是write.csv一般的两倍.见这里的一些基准.

library(data.table) 
fwrite(DF, "output.csv")
Run Code Online (Sandbox Code Playgroud)

请注意,排除了行名称,因为该data.table类型不使用它们.


Dav*_*agh 7

虽然我只用它来读取非常大的文件(10+ Gb),但我相信该ff软件包具有编写极大dfs的功能.


Ric*_*ton 7

猜测一下,你的机器内存不足,因此R必须使用交换文件,这会减慢速度.如果您获得代码付款,那么购买更多内存可能比编写新代码便宜.

也就是说,有一些可能性.您可以将文件导出到数据库,然后使用该数据库的工具写入文本文件.JD Long对这个问题的回答告诉你如何以这种方式读取文件; 逆转这个过程应该不会太难.或者,bigmemoryff包(如Davy所述)可用于编写此类文件.


ric*_*roe 7

好吧,作为真正大文件和R的答案,最好将这种工作卸载到数据库中.SPSS具有ODBC连接,并RODBC提供从R到SQL的接口.

我注意到,在检查我的信息的过程中,我被舀了.