长值的Scala位集?

长值的Scala位集?,scala,bitset,Scala,Bitset,我有一个大数据集,rowId是Long类型。 它需要指示一行是否在某个特殊集合中 我发现位集在内存和网络传输方面更有效,但不幸的是,位集可以容纳的最大值是Int 有别的办法吗?(使用布尔[]?) 多亏了位集的性质使得它们可以很容易地分解和合并在一起,从而使网络传输更容易,具体取决于您要实现的目标 但是,您始终可以构建自己的: object BitSet extends BitSetFactory[BitSet] { val empty: BitSet = immutable.BitSet.e

我有一个大数据集,rowId是Long类型。 它需要指示一行是否在某个特殊集合中

我发现位集在内存和网络传输方面更有效,但不幸的是,位集可以容纳的最大值是Int

有别的办法吗?(使用布尔[]?)


多亏了位集的性质使得它们可以很容易地分解和合并在一起,从而使网络传输更容易,具体取决于您要实现的目标

但是,您始终可以构建自己的:

object BitSet extends BitSetFactory[BitSet] {
  val empty: BitSet = immutable.BitSet.empty
  def newBuilder = immutable.BitSet.newBuilder

  implicit def canBuildFrom: CanBuildFrom[BitSet, Long, BitSet] = bitsetCanBuildFrom
}

trait BitSetFactory[Coll <: BitSet with BitSetLike[Coll]] {
  def empty: Coll
  def newBuilder: Builder[Long, Coll]
  def apply(elems: Long*): Coll = (empty /: elems) (_ + _)
  def bitsetCanBuildFrom = new CanBuildFrom[Coll, Long, Coll] {
    def apply(from: Coll) = newBuilder
    def apply() = newBuilder
  }
}

trait BitSetLike[+This <: BitSetLike[This] with SortedSet[Long]] extends SortedSetLike[Long, This] { self =>
对象位集扩展了位集工厂[BitSet]{
val empty:BitSet=immutable.BitSet.empty
def newBuilder=immutable.BitSet.newBuilder
隐式def canBuildFrom:canBuildFrom[位集,长,位集]=位集canBuildFrom
}

特征比特集工厂[Coll要将2^64个不同的长度表示为一个位集,您需要2 PB的内存。这几乎没有效率:)@Dima不确定这是什么操作asked@gurghet我很确定这就是他问的:)我的意思是,也许他想问一些不同的问题,我不知道,但他问的是这个。谢谢你的讨论。也许问题可能会更好。实际上,我需要一个更高效的数据结构来指示一行是否在给定的集合中。换句话说,为了指示一个数字是否是另一个集合,以防有很多数字,特别是在分布式系统中,如Spark。起初我认为位集可能有利于内存和传输,但同样重要@Dima说,当有太多的数字时,位集本身将消耗大量内存,而且这些数字也可能分布稀疏。这没有什么神奇之处。每个数字至少需要一位。因此,如果有“太多的数字”,您的要求是能够明确回答每个给定的数字,无论它是否在一个集合中,您将需要大量内存。否则,可能会有选择。也许,实际上没有那么多数字(仅因为id很长,使用整个长域并不重要)。或者,您可能不介意偶尔出现误报(在这种情况下,您需要一个
Bloom Filter
)…感谢您为我提供了一个指示,使位集能够容纳更多的数字。