R 我的小组成员不';t似乎正在磁盘帧中工作

R 我的小组成员不';t似乎正在磁盘帧中工作,r,data.table,disk.frame,R,Data.table,Disk.frame,我在一个大数据集(>20GB)上运行了一个GROUPBY,但它似乎不太正常 这是我的密码 mydf[, .(value = n_distinct(list_of_id, na.rm = T)), by = .(week), keep = c("list_of_id", "week") ] 它返回了这个错误 警告消息:1:序

我在一个大数据集(>20GB)上运行了一个GROUPBY,但它似乎不太正常

这是我的密码

mydf[, .(value = n_distinct(list_of_id, na.rm = T)),
                      by = .(week),
                      keep = c("list_of_id", "week")
                      ] 
它返回了这个错误

警告消息:1:序列化(数据,节点$con):
“package:MLmetrics”在加载2:In时可能不可用 序列化(数据,节点$con):“包:MLmetrics”可能不可用 加载3:In serialize(数据,节点$con)时:'package:MLmetrics' 在序列化(数据,节点$con)中加载4时可能不可用:
“package:MLmetrics”在加载5:In时可能不可用 序列化(数据,节点$con):“包:MLmetrics”可能不可用 加载6:In serialize(数据,节点$con)时:'package:MLmetrics' 在序列化(数据,节点$con)中加载7时可能不可用:
“package:MLmetrics”在加载8:In时可能不可用 序列化(数据,节点$con):“包:MLmetrics”可能不可用 装载时

我最初加载了库,但在运行此代码之前,我运行了remove.packages(MLmetrics)。此外,我检查了conflicted::conflict\u scout,包MLmetrics中没有显示任何冲突

当我运行此代码时

> mydf %>% 
+   filter(week == "2012-01-02")
它给了我这个输出

         week    value 
1: 2012-01-02      483     
2: 2012-01-02     61233  

我担心在对数据进行分组时出现了问题,因为它没有创建价值周的不同分组。这两列都存储为数据类型字符。

disk.frame
看起来很有趣,可以填补RAM处理和大数据之间的空白

为了测试它,我创建了一个200*200 Mb CSV文件的集合,总容量为40Gb,高于我计算机上安装的32Gb RAM:

library(furrr)
library(magrittr)
library(data.table)
library(dplyr)
library(disk.frame)
plan(multisession,workers = 11)
nbrOfWorkers()
#[1] 11

filelength <- 1e7

# Create 200 files * 200Mb
sizelist <- 1:200 %>% future_map(~{
  mydf <- data.table(week = sample(1:52,filelength,replace=T),
                     list_of_id=sample(1:filelength,filelength,replace=T))
  filename <- paste0('data/test',.x,'.csv')
  data.table::fwrite(mydf, filename)
  ##write.csv(mydf,file=filename)
  file.size(filename)
})

sum(unlist(sizelist))
# [1] 43209467799
所以它起作用了! 用于此特定任务的总RAM内存在1到5Gb之间波动,6个处理器上20亿行的内存占用时间不到10分钟,限制因素似乎是磁盘访问速度,而不是处理器性能

我还测试了
data.table
语法,因为
disk.frame
接受这两种语法,但我返回的行数太快了60倍(好像200个CSV中创建的60个disk.frames没有合并和/或完全处理),还有很多
警告消息:1:In serialize(数据,节点$con)

我在上提交了一期。
在澄清这一点之前,我建议继续使用有效的
dplyr
语法


这个例子使我确信,
disk.frame
允许为{disk.frame}的作者处理大于RAM的数据

问题是目前,{disk.frame}没有在每个块中按
分组。它不像dplyr语法那样全局分组

因此,你必须再次总结,以实现你想要的。因此,我建议现在继续使用dplyr语法

正如@Waldi所指出的,
{disk.frame}
的dplyr语法运行良好,目前还缺乏对data.table的支持,因此目前只能使用dplyr语法实现所需的功能

{disk.frame}需要先实现,然后才能用于data.table


如果任何人/组织想资助此功能的开发,请告诉我。

什么是
disk.frame
?@sindri_baldur,请参阅提供示例数据,不必是20GB,只有几行有2个以上的组,以便我们可以运行与您尝试运行的相同的查询。调试问题时,尽量减少代码中的依赖项数量,以确保问题不是由包相互干扰引起的。因此,您可以只使用
操作符,而不是使用冲突的pkg。可能在disk.frame查询运行时需要删除的程序包?VTC:“需要调试详细信息应更新问题,以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。”如果我在输出上执行group by,然后再执行相同的group by,它是否适用于data.table语法?我担心
dplyr
语法可能会变慢dplyr可能会变慢,但不会像group by那样被磁盘操作所控制!所以在这个阶段我不介意。
setup_disk.frame()
#The number of workers available for disk.frame is 6
options(future.globals.maxSize = Inf)

mydf = csv_to_disk.frame(file.path('data',list.files('data')))
"
csv_to_disk.frame: Reading multiple input files.
Please use `colClasses = `  to set column types to minimize the chance of a failed read
=================================================

 ----------------------------------------------------- 
-- Converting CSVs to disk.frame -- Stage 1 of 2:

Converting 200 CSVs to 60 disk.frames each consisting of 60 chunks

 Progress: ──────────────────────────────────────────────────────────────── 100%

-- Converting CSVs to disk.frame -- Stage 1 or 2 took: 00:01:44 elapsed (0.130s cpu)
 ----------------------------------------------------- 
 
 ----------------------------------------------------- 
-- Converting CSVs to disk.frame -- Stage 2 of 2:

Row-binding the 60 disk.frames together to form one large disk.frame:
Creating the disk.frame at c:\TempWin\RtmpkNkY9H\file398469c42f1b.df

Appending disk.frames: 
 Progress: ──────────────────────────────────────────────────────────────── 100%

Stage 2 of 2 took: 59.9s elapsed (0.370s cpu)
 ----------------------------------------------------- 
Stage 1 & 2 in total took: 00:02:44 elapsed (0.500s cpu)"


result <- mydf %>% 
  group_by(week) %>% 
  summarize(value = n_distinct(list_of_id)) %>% 
  collect  

result
# A tibble: 52 x 2
    week   value
   <int>   <int>
 1     1 9786175
 2     2 9786479
 3     3 9786222
 4     4 9785997
 5     5 9785833
 6     6 9786013
 7     7 9786586
 8     8 9786029
 9     9 9785674
10    10 9786314
# ... with 42 more rows