【问题标题】:What a good way to get in-memory cache with data.table使用 data.table 获得内存缓存的好方法
【发布时间】:2013-03-27 22:18:41
【问题描述】:

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

我可以将所有这些读入 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 秒。这是一个虚拟服务器。不确定它有什么样的存储或缓存对读取速度的影响有多大。

【问题讨论】:

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

标签: r data.table


【解决方案1】:

非常正确:data.table 尚未访问磁盘表。与此同时,一些选项是:

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

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

  • 如果您有较大的分隔文件,那么最近有人报告说fread() 的出现速度比load() 快得多。但是尝试compress=FALSE。另外,我们刚刚将fwrite 推送到了最新的开发版本(1.9.7,使​​用devtools::install_github("Rdatatable/data.table") 安装),它的reported write times 与原生save 相当。

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

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

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

编写内部结构时考虑了磁盘表。但不要屏住呼吸!

【讨论】:

    【解决方案2】:

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

    这可以在 Linux 上很容易地解决,只需将此行添加到 /etc/fstab:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 2021-07-16
        • 2023-01-15
        • 1970-01-01
        • 2016-08-31
        • 2011-01-31
        • 2011-06-14
        • 2019-06-25
        • 2022-06-17
        相关资源
        最近更新 更多