存储和使用对内存来说太大的数据帧的最佳做法?

时间:2009-12-09 18:21:39

标签: r out-of-memory

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

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

3 个答案:

答案 0 :(得分:25)

你可能想看一下这些包:

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

并且还可以看到High-Performance Computing任务视图。

答案 1 :(得分:0)

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

  1. 清除消耗RAM的其他进程。确保您没有打开包含许多标签的浏览器,因为它们似乎占用了大量内存。

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

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

  4. 以下是示例代码:

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

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

    3. 我希望它有所帮助。

答案 2 :(得分:0)

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

与限制容易处理的数据类型的ffbigmemory不同,它尝试“模仿” data.frame并提供dplyr动词来处理数据。