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

时间:2012-03-14 13:36:24

标签: r export export-to-csv

我在R中有一个相当大的数据框,我想导出到SPSS。 这个文件首先尝试将其导入R,这让我感到头疼,但是我使用read.fwf()使用comment.char="%"(文件中没有出现的字符)和{{1}成功使用fill= TRUE (它是一个固定宽度的ASCII文件,其中一些行缺少所有变量,导致错误消息)。

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

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

5 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:14)

更新

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

现在data.table有一个fwrite函数,由Otto Seiskari提供,一般来说似乎是write.csv的两倍。有关基准测试,请参阅here

library(data.table) 
fwrite(DF, "output.csv")

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

答案 2 :(得分:7)

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:7)

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

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