关于r:存储和使用对内存来说太大的数据帧的最佳实践?

Best practices for storing and using data frames too large for memory?

我正在使用大型数据框,并且已经遇到RAM限制。 此时,我可能需要在磁盘上使用序列化版本。 有一些软件包支持内存不足的操作,但我不确定哪一个适合我的需求。 我宁愿将所有内容保存在数据框中,因此ff包看起来很令人鼓舞,但仍存在兼容性问题,我无法解决。

当您意识到数据已经达到内存不足时,第一个可以实现的工具是什么?


你可能想看看这些包:

  • ff用于'平面文件'存储和非常有效的检索(可以做data.frames;不同的数据类型)
  • out-of-r-memory但仍在RAM(或文件支持)中使用的bigmemory(只能执行矩阵;相同的数据类型)
  • biglm用于lm()glm()式模型的内存模型拟合。

还可以看到高性能计算任务视图。


我会说disk.frame是这类任务的理想选择。我是该软件包的主要作者。

与限制哪些数据类型易于处理的ffbigmemory不同,它试图"模仿"data.frame并提供dplyr动词来操作数据。


如果您正在处理内存问题,则应尝试以下步骤:

  • 清除消耗RAM的额外进程。确保您没有打开包含许多选项卡的浏览器,因为它们似乎消耗了大量RAM。

  • 完成步骤1后,了解数据集文件的结构。为此,请使用read.csv(nrow = 100)。通过这样做,您将了解什么是列和列结构。如果您发现任何列无效,请将其删除。

  • 一旦知道列结构(colclasses),就可以一次性导入整个数据帧。

  • 以下是示例代码:

    1
    2
    3
    initial <- read.table("datatable.txt", nrows = 100)
    classes <- sapply(initial, class)
    tabAll <- read.table("datatable.txt", colClasses = classes)
  • 使用fread()读取大型数据帧。

  • 如果它仍然没有解决问题,那么将数据集分成两部分,将行数分成两个相等的部分,然后在应用维度减少技术后合并它们。

  • 我希望它有所帮助。