当前位置: 首页 > 知识库问答 >
问题:

在每个分区内用共享指针触发RDDs(以及神奇的数字200??)

桂高昂
2023-03-14

我试图持久化一个spark RDD,其中每个分区的元素都共享对单个大型对象的访问。但是,这个对象似乎在内存中存储了几次。把我的问题归结为只有200个元素的单个分区的玩具箱:

val nElements = 200
class Elem(val s:Array[Int])

val rdd = sc.parallelize(Seq(1)).mapPartitions( _ => {
    val sharedArray = Array.ofDim[Int](10000000) // Should require ~40MB
    (1 to nElements).toIterator.map(i => new Elem(sharedArray))
}).cache()

rdd.count() //force computation    

这是什么原因造成的?这个神奇的数字200从何而来,我怎样才能增加它?

编辑以获得澄清:

向函数中添加一个println会显示它实际上只被调用一次。此外,运行:

rdd.map(_.s.hashCode).min == rdd.map(_.s.hashCode).max  // returns true

共有1个答案

郦祯
2023-03-14

对于将来遇到这个问题的人来说,我最终想出了一个超级黑客的解决方案(尽管我仍然很乐意听到更好的解决方案)。我不使用rdd.cache(),而是定义:

def cached[T: ClassTag](rdd:RDD[T]) = {
    rdd.mapPartitions(p => 
        Iterator(p.toSeq)
    ).cache().mapPartitions(p =>
        p.next().toIterator
    )
}

以便cached(rdd)返回从“cached”列表生成的rdd

 类似资料:
  • 问题内容: 我已经尝试了好几个小时,并且用谷歌搜索了所有我想到的东西,但是我快要疯了。 我有一个结构: 直到以后,我才知道int (矩阵)和char 的大小。 完成后,我将创建共享内存,如下所示: 没问题 然后,我给ctrl-> rows和collumns赋一个值,并将0赋给所有矩阵。 但是之后,我在char *和bam中写了一些段错误。 调试程序时,我看到mat和IDs_row这两个指针都为nu

  • 我在“C编程语言,第4版”第17.5.1.3章中找到了下面的代码 我不明白最后一条评论,确实y.p应该在reset()调用后指向一个新的内存地址,所以 应该让y.p不变,不是吗? 谢谢

  • 问题内容: 我试图通过ctypes用Python中定义的回调替换共享库中的现有函数指针。 C中共享库的源代码: Python脚本的来源: 测试它的脚本: 我得到的输出: 因此,似乎在Python(plotxy)中定义的函数是type ,而在C中定义的函数指针是type 。尽管应用了替换in ,但在调用main函数时似乎没有任何效果。 除了阅读https://docs.python.org/3/li

  • 如果一个数组中的所有元素保存的都是 指针,那么我们就称它为 指针数组。指针数组的定义形式一般为: dataType *arrayName[length]; 的优先级高于 ,该定义形式应该理解为: dataType *(arrayName[length]); 括号里面说明 是一个数组,包含了 个元素,括号外面说明每个元素的类型为 。 除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的

  • 本文向大家介绍指针数组、数组指针、函数指针的区别?相关面试题,主要包含被问及指针数组、数组指针、函数指针的区别?时的应答技巧和注意事项,需要的朋友参考一下 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32

  • shared_ptr被用来表示共享的拥有权。也就是说,当两段代码都需要访问一些数据,而它们又都没有独占该数据的所有权(从某种意义上来说就是该段代码负责销毁该对象)。这是我们就需要shared_ptr。shared_ptr是一种计数指针。当引用计数变为0时,shared_ptr所指向的对象就会被删除。下面我们用一段代码来说明这点。 void test() { shared_ptr p1(ne