对象比相应的 .RData 文件大得多。为啥?可以手动做吗?

Posted

技术标签:

【中文标题】对象比相应的 .RData 文件大得多。为啥?可以手动做吗?【英文标题】:Object much larger than corresponing .RData file. Why? Can you do it manually?对象比相应的 .RData 文件大得多。为什么?可以手动做吗? 【发布时间】:2015-11-24 14:47:09 【问题描述】:

我创建了一个大约等于 11MB 的 data.table(类似于 data.frame -- 参见下面的 cmets)对象(我使用 object.size() 函数找到了它的大小)。

当我使用save() 函数将此文件保存到磁盘时,生成的文件大小等于 736KB。

(1) 这怎么可能?

(2) 是否可以手动使用 write.bin()函数?

data.table 有 121,328 行和 13 列。列的数据类型是

    日期(2 列) 字符(5 列) 整数(3 列) 数字(3 列)

data.table的前五行如下

          date     time QTind OPRAseqNum OEC OCC   Bid BidSize   Ask AskSize type expiration strike
 1: 2005-01-03 09:30:24     Q      94698   C     707.2       1 710.2       1    C 2006-06-17    500
 2: 2005-01-03 09:30:24     Q      94946   C     707.2       1 710.2       1    C 2006-06-17    500
 3: 2005-01-03 09:30:24     Q      94948   C     707.0       1 710.0       1    C 2006-06-17    500
 4: 2005-01-03 09:30:24     Q      94950   C     707.0       1 710.0       1    C 2006-06-17    500
 5: 2005-01-03 09:30:26     Q      98083   C     707.2       1 710.2       1    C 2006-06-17    500

【问题讨论】:

与同等data.frame的大小相比如何?我不确定这是使用 data.table 的结果,而是 R 使用额外内存来表示对象的事实(例如,整数在 R 中占用的字节数远远超过 4 或 8 个字节) - 请参阅 here。 @nrussel 这不是使用data.table 的结果。仅供参考,data.table 的大小是 11553440 bytes,对应的 data.frame 的大小是 11552328 bytes。谢谢你的链接。 @nrussel 我会更正标题和标签 【参考方案1】:

RAM 中的对象没有被压缩;写入磁盘的文件是。这解释了大小的差异。据我所知,在 R 中无法对压缩对象执行操作。

有一个手动“解决方案”,但您可能不会喜欢它。您可以将 data.table 分解成更小的块,将它们压缩到磁盘。然后如果你想对整个表做一个操作,你可以解压缩一个块,做这个操作,然后重新压缩它。当然,这会导致明显的性能下降。如果您想要整列的平均值,也会有一些额外的工作。

另外,更灵活一点,要获得列式存储(如果您更频繁地对获取某些列而不是某些行感兴趣),请查看 CRAN 上的 saves package,但 author considers it experimental 或一些其他磁盘支持的列式数据存储。

但是,这两种选择最终都会在 RAM 中生成一个未压缩的表(在某一时刻),它们只是减少了您必须引入的表的数量。

【讨论】:

所以如果我理解正确,我无法使用 R 将其保存为压缩文件,但是当 R 将其保存到磁盘时(使用 save() 函数)它会自动压缩它? @conighion 或多或少是正确的。当 data.table 是 R 命名空间(在 RAM 中)中的对象时,它不是“文件”。当您将它保存到磁盘时,它会变成一个“文件”,默认情况下它是一个压缩文件。查看 compress 选项下的 ?save 以了解它是如何处理压缩的。 谢谢。我使用了命令save(object, file = "Filename.dat", compress = F),文件的大小变成了大约12MB。

以上是关于对象比相应的 .RData 文件大得多。为啥?可以手动做吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python CSV to JSON:为啥 JSON 比 CSV 文件大得多,如何修复?

为啥我的 favicon.ico 文件比其各部分的总和大得多?

为啥使用 Meson / Ninja 生成的二进制文件比普通 valac 编译的要大得多?

为啥链接区域的高度比文本大得多?

为啥 InnoDB 表大小比预期大得多?

HBase 表大小比 hadoop hdfs 中的文件大得多