n_distinct 是磁盘帧的精确计算吗?

Is n_distinct an exact calculation with disk frames?

我正在 运行 n_distinct 处理一个大文件 (>30GB),它似乎没有产生准确的结果。

我有另一个数据参考点,磁盘帧聚合中的输出已关闭。

它在文档中提到 n_distinct 是精确计算,而不是估计。

对吗?

可以在此页面上找到 n_distinct 的实现 https://github.com/xiaodaigh/disk.frame/blob/master/R/one-stage-verbs.R

#' @export
#' @rdname one-stage-group-by-verbs
n_distinct_df.chunk_agg.disk.frame <- function(x, na.rm = FALSE, ...) {
  if(na.rm) {
    setdiff(unique(x), NA)
  } else {
    unique(x)
  }
}

#' @export
#' @importFrom dplyr n_distinct
#' @rdname one-stage-group-by-verbs
n_distinct_df.collected_agg.disk.frame <- function(listx, ...) {
  n_distinct(unlist(listx))
}

现在,它看起来是我想要的精确计算。逻辑很简单,它计算每个块中的 unique,然后 n_distinct 收集所有块的结果。

但不排除其他地方有bug

你有测试用例来证明它不完全是吗?或许你可以贡献一个 PR 来测试一下?