使用data.table获取内存缓存的好方法

Dav*_*415 6 r data.table

假设我在32 GB的服务器上有一个4GB的数据集.

我可以将所有内容读入R中,创建一个data.table全局变量,并让我的所有函数都将全局函数用作内存中的数据库.但是,当我退出R并重新启动时,我必须再次从磁盘读取它.即使使用智能磁盘缓存策略(保存/加载或R.cache),我也有10秒的延迟,因此获取该数据.复制该数据大约需要4秒.

有没有一种很好的方法可以将其缓存在内存中,以便在R会话退出后继续存在?

想到几件事,RServe,redis/Rredis,Memcache,多核...... Shiny-Server和Rstudio-Server似乎也有解决这个问题的方法.

但话说回来,似乎data.table可能提供此功能,因为它似乎无论如何都会将数据移出R的内存块.这将是理想的,因为它不需要任何数据复制,重组等.

更新:

我运行了一些更详细的测试,我同意下面的评论,我可能没有太多抱怨.

但是这里有一些其他人可能会觉得有用的数字.我有一个32GB的服务器.我创建了一个4GB大小的data.table.根据gc()并且还看顶部,它似乎使用了大约15GB的峰值内存,其中包括制作一份数据.我觉得这很好.

我用save()写入磁盘,删除了对象并使用load()重新制作它.这分别花了17秒和10秒.

我对R.cache包做了同样的事情,这实际上更慢了.23秒和14秒.

然而,这两个重载时间都非常快.load()方法给出了357 MB/s的传输速率.相比之下,副本需要4.6秒.这是一个虚拟服务器.不确定它具有什么类型的存储或读取速度受缓存影响的程度.

Mat*_*wle 5

非常正确:data.table还没有到磁盘上的表。同时,一些选项是:

  • 请不要退出R。请使其在服务器上运行,并使用svSocket对其进行evalServer()访问,如data.table主页上的视频所示。或您提到的其他类似选项。

  • 使用数据库来保持持久性,例如SQL或任何其他noSQL数据库。

  • 如果分隔文件很大,那么最近有人报告说,fread()出现速度要快得多load()。但是尝试一下compress=FALSE。此外,我们刚刚推出fwrite了最新的开发版本(1.9.7,可devtools::install_github("Rdatatable/data.table")用于安装),该报告的写入时间与native相当save

  • 软件包ffbigmemorysqldf也。请参阅“ HPC任务视图”中的“大内存和内存不足数据”部分。

data.table正在使用的企业中,我猜测目前主要是从其他持久数据库中获取数据。这些企业可能:

  • 使用具有16GB,64GB或128GB RAM的64bit。这些天RAM很便宜。(但是我意识到这不能解决持久性问题。)

内部结构已考虑到磁盘表。但是,不要屏住呼吸!