对象比相应的 .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 文件比其各部分的总和大得多?