【发布时间】: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 可能不准确。让我实际运行它。
-
您也可以考虑使用
ff或bigmemory。
标签: r data.table