r - 对象比相应的 .RData 文件大得多。为什么?你能手动做吗?

标签 r save storage binary-data

我创建了一个 data.table(类似于 data.frame -- 请参阅下面的注释)对象,它大约等于 11MB(我使用object.size() 函数)。

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

(1) 这怎么可能?

(2) 是否有可能通过手动实现这么小的尺寸 write.bin() 函数?

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

  1. 日期(2 列)
  2. 字符(5 列)
  3. 整数(3 列)
  4. 数字(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

最佳答案

RAM 中的对象未被压缩;写入磁盘的文件是。这说明了尺寸的差异。据我所知,在 R 中无法对压缩对象执行操作。

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

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

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

关于r - 对象比相应的 .RData 文件大得多。为什么?你能手动做吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33896645/

相关文章:

r - 如何在 R 中的两个 H2OFrame 之间进行交叉连接?

java - 在 Android 的内部存储中保存文件

android - 如何在内部存储中保存位图

java - Android ContentProvider applyBatch 不保存所有联系人数据

storage - 如何使用 vSphere 创建到主机的共享文件夹?

javascript - 使用javascript的html5本地存储

r - 在 RStudio 中生成多个 RMarkdown 输出

r - ESS/Emacs 中长时间运行的远程 R session 的状态如何?

r - data.table:是否可以合并 .SD 并按组返回一个新的 'sub data table'?

php - Laravel 5.3 是否可以安全地从 Laravel 项目中删除/删除存储文件夹?