R 使用data.table获取内存缓存是一种多么好的方法啊

R 使用data.table获取内存缓存是一种多么好的方法啊,r,data.table,R,Data.table,假设我在一台32GB的服务器上有一个4GB的数据集 我可以将所有这些读入R,生成一个data.table全局变量,并让我的所有函数将该全局变量用作内存中的数据库。然而,当我退出R并重新启动时,我必须再次从磁盘读取它。即使使用智能磁盘缓存策略(save/load或R.cache),我也有10秒左右的延迟来获取数据。复制这些数据大约需要4秒钟 有没有一种好方法可以在R会话退出后将其缓存到内存中 我想到了两件事,RServe、redis/Rredis、Memcache、多核。。。 闪亮服务器和Rstu

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

我可以将所有这些读入R,生成一个data.table全局变量,并让我的所有函数将该全局变量用作内存中的数据库。然而,当我退出R并重新启动时,我必须再次从磁盘读取它。即使使用智能磁盘缓存策略(save/load或R.cache),我也有10秒左右的延迟来获取数据。复制这些数据大约需要4秒钟

有没有一种好方法可以在R会话退出后将其缓存到内存中

我想到了两件事,RServe、redis/Rredis、Memcache、多核。。。 闪亮服务器和Rstudio服务器似乎也有办法解决这个问题

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

更新:

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

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

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

我对R.cache包也做了同样的操作,实际上速度较慢。23秒和14秒


然而,这两种重新加载时间都相当快。load()方法给了我357 MB/s的传输速率。相比之下,一份拷贝需要4.6秒。这是一个虚拟服务器。不确定它有什么类型的存储,也不确定缓存对读取速度的影响有多大

非常正确:
数据。表
还没有到磁盘上的表。同时,有些选择是:

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

  • 使用数据库实现持久性,如SQL或任何其他noSQL数据库

  • 如果您有大的分隔文件,那么一些人最近报告说,
    fread()
    load()
    显示得快(多)。但是用
    compress=FALSE
    进行实验。此外,我们刚刚将 Fuxe/Cuff>推到最新的开发版本(1.97,使用<代码> DeVoTo::SudithGithub(“RDATABATE/DATABLE”)安装),这与原生代码>保存< /COD> >

  • ff
    bigmemory
    sqldf
    。请参阅HPC任务视图的“大内存和内存不足数据”部分

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

  • 使用64位,比如16GB、64GB或128GB的RAM。这年头公羊很便宜。(但我意识到这并不能解决持久性问题。)

在编写内部构件时,已考虑到磁盘上的表。但不要屏住呼吸

如果您确实需要在计算会话之间出于某些奇怪的原因退出R,并且服务器没有重新启动,那么只需在RAM中创建一个4 GB的RAM磁盘,并将数据存储在那里。与任何SAS或SSD驱动器相比,将数据从RAM加载到RAM的速度要快得多:)

在Linux上,通过将这一行添加到
/etc/fstab
,可以很容易地解决这个问题:

none  /data  tmpfs  nodev,nosuid,noatime,size=5000M,mode=1777  0  0

取决于数据集的外观,可以考虑使用包FF。如果您将数据集保存为ffdf,它将存储在磁盘上,但您仍然可以从R访问数据。 ff对象有一个虚拟部分和一个物理部分。物理部分是磁盘上的数据,虚拟部分为您提供有关数据的信息


要在R中加载此数据集,您只需加载数据集的虚拟部分,该虚拟部分要小得多,可能只有几Kb,这取决于您是否有大量包含因子的数据。因此,这将在几毫秒(而不是几秒钟)内将数据加载到R中,同时仍然可以访问物理数据进行处理

data.table不提供此功能,无论如何,5GB负载的10秒对我来说非常好,加上这是一次性的,所以您能告诉我们为什么会出现问题吗?10秒可能不准确。让我来实际运行它。您还可以考虑使用
ff
bigmemory